你的位置:首页 > Java教程

[Java教程][读书笔记]Effective Java 第二章


考虑用静态工厂方法代替构造器
静态工厂方法第一大优势是可以用特有的名称。常见的类创建实例需要用构造函数,而当需要两个构造函数时,我们需要在参数列表做区分才能写出两个构造方法。使用静态工厂模式,可以规避方法名=类名的限制,使用更易读的方法呈现。
 
静态工厂方法第二大优势是不必在每次调用的时候创建一个新的实例。这点和单例设计模式有些类似,在使用不可变类的时候可以预先构建实例并缓存,之后可以重复利用,避免创建不必要的重复对象,也可以用静态工厂保证这是一个单例。可以确保不会存在两个相等的实例,即当且仅当a==b的时候才有a.equals(b)为true。如果类保证这一点,就可以使用==操作符来代替equals(Object)方法,这样可以提升性能。
 
静态工厂方法第三大优势是它们可以返回原返回类型的任何子类型对象。这种做法使得API可以返回对象又不会使得对象的类公有化。同时暴露出来的是接口声明,用户不需要关心得到的对象的类,只需要关心这个是声明接口的子类(实现类)即可。这主要是为了提升软件的可维护性和性能,因为返回的对象也会随着软件版本的变更而不同。这种模式也是服务提供者框架(Service Provider Framework)的基础。
 
静态工厂方法第四大优势是创建参数化类型实例的时候,它们使得代码变得更加简洁。在调用参数类型化的构造方法时,需要在赋值的左右都需要指定类型化参数,静态工厂方法可以通过类型推导(type inference)让编译器替你找到类型参数。
 
静态工厂方法的缺点:没有公有的或可继承的构造方法,无法被子类化;它们和静态方法没有任务区别。
 
遇到多个构造器参数时要考虑构建器
 
当类的成员过多时,参数过多让我们无法方便写出足够多的构造方法,这时候可以使用builder的模式,类似的做法可以参考Android中的Dialog.builder一样。
 
相比JavaBean来说,也可以额保证实例的一致性,安全性也更高。构建器的缺点就是需要比重叠构造器更加冗长,而且性能开销在某些时候并不好。所以,最好是在类的可选参数大于4个以上的时候考虑使用构建器。
 
用私有构造器或者枚举类型强化Singleton属性
目前有三种常用强化单例属性的方法,一种是公有化静态成员,一种是私有化静态成员并提供工厂返回实例的引用,一种是单元素的枚举类型。这些方法中,枚举是实现单例的最佳方法。
public enum Elvis{
    INSTANCE;
    public void leaveThebuilding(){...}
}
 
通过私有构造器强化不可实例化的能力
简单来说就是不让类的外部调用构造方法,显式的私有构造方法,保证编译器不会提供缺省的构造方法。缺点就是无法子类化。
 
避免创建不必要的对象
能够重用的对象尽量不要创建新对象,例如数据库连接池。在不可变的部分可以用静态来声明,使得该类的部分只会执行一次。
 
消除过期的对象引用
过期引用是指永远也不会再被解除的引用。消除过期引用最好的方法是让包含该引用的变量结束其生命周期。内存泄露一般来源于三种:第一种是类自己管理内存,程序员就应该警惕内存泄露问题;第二种是来源于缓存;第三种是来源于监听器和其他回调。常见的解决办法是使用弱应用(weak reference)。
 
避免使用终结方法
终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。当对象不再被使用,应采取使用显式终止,例如InputStream的close方法。如果子类覆盖了超类的终结方法,那么子类的终结方法必须显式调用超类的终结方法,否则超类的终结方法则永远不会被调用。