一、使用静态工厂方法替代构造器
好处有:
- 静态工厂方法有名称。当一个函数有不同的构造参数时,可以使用静态工厂方法的名称,来让用户区别该使用哪个具体的实例。
- 不需要在每次调用的时候都创建一个新的对象。(单例模式)
- 可以返回原返回类型的任何子类型的对象。
- 让类构造过程的代码更加简洁。
缺点有:
- 若类不包含公有构造函数,则它无法被继承
- 没办法像构造函数一样被javadoc标注出来,可以会让用户找不到该如何实例化。
二、遇到多个构造参数时要考虑用构造器(感觉编写起来比较麻烦咯,如果不用考虑线程安全问题,那么多个参数的实例化就使用javabean模式)
如果直接使用构造函数初始化的话,会造成构造函数参数过多,难以控制。如果使用javabean模式初始化的话,可能会有线程安全的问题。使用Builder模式,既可以保证像使用构造器那样的安全性,又可以得到像使用javabean一样好的可读性。这个builder是它构建的类的静态成员类。
三、四、使用私有构造函数或者枚举类型强化Singleton属性
就是单例模式的写法,构造起私有化,让客户端不能通过构造起去初始化对象。然后使用private static final属性去实例化一个唯一的对象。另外只包含单元素的枚举类型的写法,比较简洁,有机会可以试试。
五、避免创建不必要的对象
提高程序性能的方法,少创建不必要的对象,可以节约jvm资源,并节省程序运行时间。(比如把一些在方法中每次需要重复实例化的对象,放到全局变量中,在具体方法中只返回一次)
六、消除过期的对象引用
防止很隐蔽的程序泄漏,因为把无用的对象引用保存下来,jvm就不会回收这些对象。比如:
1 public Object pop() 2 { 3 return elements[--size]; //没有消除elements[size]这个过期引用 4 }
应该改成:
1 public Object pop() 2 { 3 Object result = elements[--size]; 4 elements[size] = null; //此处消除过期引用,elements[size]所指向的对象也会被jvm回收掉 5 return result; 6 }
七、避免使用终结方法
终结方法(finalizer)是不可预测的,很危险,不要使用finalizer方法去做一些逻辑。具体有:
- 终结方法不能保证自身可以立马执行,因为jvm的回收时间是不可预测的。若在终结方法中关闭连接,可能会造成大量连接持续保留在连接状态而得不到释放。甚至使用system.gc方法也不能保证终结方法一定被执行到。(另外不要使用system.gc方法,会造成程序没必要的卡顿)
- 性能损失。销毁一个对象的时间会增大几百倍。
通常,种植方法是 try{}catch{}finally{} 这么结合使用的,这样可以保证终止方法立马得到执行。