Effictive Java 一 创建和销毁物件
一、 用静态工厂方法代替构造函数。
???? 静态工厂方法的好处是
?????? 1、 静态工厂方法有名字,你可以很容易的决定选择哪个方法,而不是像用构造函数一样需要根据参数列表来选择
?????? 2、 静态工厂方法不一定需要创建对象,可以使用预先缓存的对象,
?????? 3、 静态工厂方法可以返回指定返回类型的任意的子类型,可以在未来修改实现而不需要修改方法签名
?????? 4、 减少创建泛型实例的复杂度
???? 静态工厂方法的缺点是
?????? 1、 如果你不提供public或者protected的构造函数,这个类就不能被继承
?????? 2、 不易跟其他的静态方法区分开来,当然可以通过valueOf, getInstance这类的命名来使静态工厂方法显眼一些。
?
二、使用 private 的构造函数来实现单例
????? 注意如果该单例类实现了序列化,那么还需要覆盖 readResolve() 方法
?
public Object readResolve() throws ObjectStreamException { return INSTANCE;}?
?
三、使用 private 的构造函数来实现对象的不可以实例化,例如常量类是不需要 可实例化的。
?
四、避免创建重复物件
?????? 反例: String s = new String("silay");如果反复执行,那么每次都是创建内容相同的新实例。
?????? 而 String s = "silay"; 只使用单一实例。
?????? 如果一个方法被频繁调用,方法中的 new 新实例,如果可以尽量放在方法体外只声明一次或声明为static
?
五、清除过期的对象。例:
?
public Object pop(){ if (size==0) throw new Exception(); Object result = elements[--size]; elements[size] == null; //注意,如果没有这句话,被引用对象不会被回收除 //非本类也不被引用 return result;}
??? 此类问题在 自己实现的cache 或 pool时应特别注意
?
六、避免使用 finalizers因为他的执行是不确定的。他的优先级并不高。
????? 另:异常发生在 finalization 期间将不会被抛出。
????? 正常应该用 try catch finally 明确的终结一个资源
?
七、...
?