对象创建得不好,会引发OOM,和常见的代码难维护问题。
优先通过静态方法替换构造器
通过静态方法而不是构造器的优势
Maps.newHashMap();
public static <K, V> HashMap<K, V> newHashMap() {
return new HashMap<K, V>();
}
1:有方法名可以用来区分场景(valueof,of,getInstance,newInstance,getXXX,newXXX)
2:帮助复用对象(valueof,of)和单例(getInstance)
3:通过声明接口可以返回任意实现类
4:减少多余的范型声明
劣势
1:静态方法往往配合私有构造器,导致类本身无法extends
2:调用的时候没有语法支持,无法快速识别这是一个构造方法
Builder
当有多个构造器的常见的时候,用Builder模式。
public class Person {
private final String name;
private final int age;
private Person(Builder builder) {
this.name = builder.name;
this.age = builder.age;
}
public static class Builder{
private String name;
private int age;
public Builder(String name){
this.name=name;
}
public Builder age(int age){
this.age = age;
return this;
}
public Person build(){
return new Person(this);
}
}
}
复用对象
1:可以“string”的时候,不要new String(“string”)
2:对象是不可变是,能不new 的尽量共同同一个。参考数据库连接池
3:能long的时候,不要用Long,避免触发装箱拆箱产生多余消耗
4:当对象是pojo是,不要为了复用反复拷贝。
对象无用的时候,记得消除对象的引用
array[i] = null;可以让gc有效
单例的创建
1:final static instance配合private 构造函数{throw new Runtime();}
2:单个的枚举本身
3:扩展的provider 模式,如guice ,spring,guava等包装过的单例