1.应当用静态工厂方法代替new一个对象。
原因:工厂方法有特定的名字,方便客户端代码阅读。
对于一些非可变对象,可以通过工厂方法复用对象,并且可以直接使用==判断对象是否相等
可以返回原返回类型的子类型
2.私有构造函数保证单例(singleton)
使用public static final域:简单方便,性能好点
使用static方法:能添加一些逻辑
3.私有的构造函数保证类和子类不可实例化
通常用在一些工具类上
4.避免创建重复对象
入new String("hello")
一些重复的开销大的不会变的对象可以放到static块中去初始化,放到方法中会每次调用都创建一个
map的keySet方法返回的Set集合是同一个对象,只是其中的值会发生变化
只是针对重量级的对象,如线程池,小对象创建要比维护线程池高效
5.消除过期引用
主要是数组,hash等缓存中的对象。可以使用weakhashmap或者LinkedHashMap的removeEldestEntry方法消除过期对象
6.应该尽量避免终结函数finalize
终结方法不确定何时执行
终结方法中产生异常不会被抛出,导致程序使用状态错误的对象
finally中可以做一些关闭资源的操作,因为即使前面出异常,finally块中的代码也会被执行到
7.重写equals方法要注意
自反性,对称性,传递性,一致性,非空性
8.hashCode方法的作用
hashCode方法用作Set,hashMap等散列数据结构中,想散列中存一个值不可能逐个调用equals方法看要存的值是否已存在,散列内部维护一个table,将要存的值计算出hashCode后去table中看是否已存在,如果存在则比较equals是否相等,不等则重新散列存入,如果不存在直接存入。
equals相等的对象hashCode也必须相等
hashCode不等,equals也必然不想等
重写equals方法也必须重写hashCode方法