Effective Java 学习笔记之创建和销毁对象

时间:2021-11-03 07:54:53

一、考虑用静态工厂方法代替构造器

1、此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法。

2、静态工厂方法的优势有:

a、使用不同的方法名称可显著地表明两个静态工厂方法的不同,而不像构造器,名字只能是类名。

b、并不是每次调用静态工厂方法,都会重新构造一个新的对象。

c、可以返回类型的子类型的对象。

d、创建参数化类型的实例时,代码变得简洁了。

3、静态工厂方法的缺点有:

a、类如果不含有公有的或者受保护的构造器,就不能被子类化(静态工厂方法的存在导致构造器存在的必要性降低)

b、与其他的静态方法实际上没有任何区别。

4、静态工厂方法的惯用名:

a、valueOf(类型转换方法)

b、of(同valueOf,在EnumSet中流行)

c、getInstance

d、newInstance(返回新的实例对象)

e、getType(处于不同的类时使用,返回的实例对象的类型是Type)

f、newType(同getType,返回新的实例对象)

二、遇到多个构造器参数时要考虑用构建器

1、重叠构造器(telescoping constructor)模式:第一构造器只包含必要的参数,后面的构造器依次叠加可选参数。

2、JavaBeans模式:无参的构造器构造对象,调用setter方法来设置必要的参数和可选参数。

3、Builder模式:不直接生成想要的对象,让客户端利用必要的参数来调用构造器(或静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置可选参数。最后,客户端调用无参的build方法来生成不可变的对象。

4、设置了参数的builder生成了一个很好的抽象工厂。客户端将一个builder传给方法,该方法能够为客户端创建一个或多个对象。

5、构建器的缺点:

a、为了创建对象,必须要先创建构建器,带来性能损耗

b、使用过程比重叠构建器模式更加冗长。

6、使用时机:类的构造器或者静态工厂中具有多个参数,特别是含有大多数参数都是可选的时候,Builder模式是不错的选择。

三、用私有构造器或者枚举类型强化Singleton属性

1、仅被实例化一次的类,称为Singleton,代表本质上唯一的系统组件。Singleton会使它的客户端测试变得十分困难。

2、实现Sigleton的三种方法:

a、公有静态成员是个final域(自己保证序列化,需要额外的操作:比如transient所有实例域,提供readResolve方法等)

b、公有静态工厂方法(自己保证序列化,需要额外的操作:比如transient所有实例域,提供readResolve方法等)

c、只包含一个元素的枚举类型。(最佳方法)

四、通过私有构造器强化不可实例化的能力

五、避免创建不必要的对象

1、注意避免过度问题,除非对象是重量级的,或者没有必要维护自己的对象池。

六、消除过期的对象引用

1、如果类是自己管理内存,就应该要警惕内存泄漏问题。

2、内存泄漏的另一个常见来源是缓存,使用WeakhashMap可以解决部分问题

3、内存泄漏的第三个来源是监听器和其他回调。WeakHashMap可以解决部分问题。

七、避免使用终结方法

1、除非是为了作为安全网,或者为了终止非关键的的本地资源,否则不使用终结方法。注意“终结方法链”不会自动执行,需要自己调用super.finalize方法。或者对于公有的非final类,考虑使用总结方法守卫者。