书写的好处就是,可以减少大脑记忆的压力,同时会加深对内容的理解。
1、考虑使用静态工厂代替构造函数
好处:1)BigInteger.probablePrime,通过该种静态方法能够更直观的获得构造函数所不能表示的信息。2)不一定每次都要创建一个新的对象。3)可以返回当前类的子类具备更好的灵活性 ;
常见的 valueOf getInstance
https://www.jianshu.com/p/ceb5ec8f1174
2、使用私有构造函数强化singleton属性
也就是说只能通过getInstance获取实例,在一定程度上提高了使用的灵活性,在不改变API的情况下,可以改变实现。
注意:在序列化与反序列化时要重写 readResolve()?,以免创建新的实例
3、通过私有构造函数强化不可实例化的能力
如 Private Arrays(){} 全部都是静态方法,这种类应该避免被实例化,防止滥用,通过把类做成抽象类也是行不通的,该类的子类可以实例化。
4、避免重复创建对象
1)重用非可变对象 字符串、 Boolean.valueOf 2)可变对象,但是不再产生变化。
5、消除过期的对象引用
java也会有个OOM的问题,不要持有无用的对象引用。
java在对象不可达后,垃圾回收器会回收与该对象相关联的存储空间。
6、避免使用终结函数
有两种理解:
(1)、在网上搜了一下java终结函数,涉及到的内容全部都是effactive java ,我很怀疑,终结函数是很早以前的jdk 版本提供的,当前的版本已经不在支持
(2)、这节中提到了InputStream和OutputStream还有Timer的终结函数:
Timer中的cancel如下:
public void cancel() {
synchronized(queue) {
thread.newTasksMayBeScheduled = false;
queue.clear();
queue.notify(); // In case queue was already empty.
}
}
可以了解到jre并没有提供终结函数,终结函数只是我们用来清理内存的一种显示方式,但是jvm如何检查到我们自己定义的函数,并且在执行System.runFinalizersOnExit(已废弃),之前调用.
@Deprecated
public static void runFinalizersOnExit(boolean value) {
Runtime.runFinalizersOnExit(value);
}