第一条:考虑用静态工厂方法代替构造器。不直接对应设计模式中的工厂方法。
优势:有名称。
不必每次调用他们的时候都创建一个新的对象。
可以返回原返回类型的任何子类型的对象。
在创建参数化类型实例的时候,它们使代码变得更加简洁。Map> m = HashMap.newInstance();
缺点:类中如果不含有公有的或者受保护的构造器,就不能被子类化。
他们与静态方法实际上没有任何的区别。
第二条:遇到多个构造器参数时,要考虑用构建器。考虑使用Builder模式,可以利用单个builder构建多个对象。构建器也比JavaBeans更加安全。
第三条:用私有构造器或者枚举型强化Singleton属性。
第四条:通过私有构造器强化不可实例化的能力。
第五条:避免创建不必要的对象。对于同时提供了静态工厂方法和构造器的不可变类,通常使用静态工厂方法而不是构造器,以避免创建不必要的对象。
第六条:消除过期的对象引用。
一般而言,只要是类自己管理内存,就要警惕内存泄漏的问题,一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空。(stack,pop处容易oom)。
内存泄漏的另一种常见来源是缓存。可以使用weakhashmap来替代。当缓存项过期之后,它们会自动删除。
内存泄漏第三种情况就是:监听器和其他回调。不应该依赖终结方法来更新重要的持久状态。显示终止的方法典型例子是InputStream、outputStream和Connection上的close方法。
第七条:避免使用终结方法
终结方法的好处是: 当对象的所有者忘记调用显示终止方法时,终结方法可以充当“安全网”。
对象的本地对等体。对象的本地对等体是一个本地的对象,普通对象通过本地方法委托给一个本地对象。本地 对等体不是一个普通对象,所以垃圾回收器不会知道它。
第八条:覆盖equals时请遵守通用的约定
类的每个实例本质上都是唯一的。
不关心类是否提供给了逻辑相等的测试功能。
超类已经覆盖了equals,从超类继承过来的行为对于子类来说也是合适的。
类是私有的或者是包级私有的,可以确定它的equals方法永运不会被调用。