一.考虑使用静态工厂代替构造器。
优点:1、静态工厂方法有名称。2、静态工厂方法可以做实例控制,不必每次都创建对象。3、可以返回类型的子类型实例。4、在泛型类型中,可以在执行静态工厂方法时利用类型推导。例:MyMap<String,String> map = new MyHashMap.newInstance();
缺点:1、如果用静态工厂方法代替了公有或者受保护的构造器,就不能被子类化。因为类型实例化是自上而下进行的。2、在类型中使用静态工厂方法实例化,对于客户端程序员来讲缺少跟明显的文档标示。
二.构造器参数多时使用builder模式。
builder模式可以增加程序的可读性,避免重复多参构造器的繁琐,也比javabean模式使用set方法更能保证对象的内部约束。
三.用私有构造器强化单例属性。
静态方法实现的单例比静态final实例的单例更灵活(可以考虑是否单例)。单例模式的类在序列化时,为了保持单例的特性,要提供readResolve方法。
四.通过私用构造器强化不可实例化的能力。
当类只提供静态方法时,不希望被实例化,考虑通过似有的构造器来强化这一特点。、
五.避免创建不必要的对象。
比如:String s = new String("hello");就应该改成String s = "hello";对于不可变的对象,它就始终可以被重用,没有必要为它创建新的实例。
对于提供了静态工厂方法的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。
方法中的常量对象,考虑使用类变量来替换,可以避免在运行时创建不必要的对象。
优先使用基本类型而不是装箱基本类型,避免无意识的对象创建。
但是,小对象的创建和回收,在现代的jvm中是很廉价的。通过在程序中创建附加的小对象,可以提升程序的简洁性。
六.消除过期的引用
对于自己实现的集合类等,当集合对象中的元素被废弃时,应该把这些引用置为null,避免保留不必要的引用。但是并不表示在代码中要常规得清空对象引用。垃圾回收的算法会找到不再被需要的对象。现代jvm使用的tracing算法从根节点开始找被引用的对象,得到众多的引用链上的对象,这些对象就是存活的,会保留下来。跟节点包括:
1.栈中的引用
2.方法区中的静态引用
3.JNI中的引用
对于集合内部列表中引用的对象,如果集合不把不使用的对象引用清理掉,因为集合对象还存活着,没有被清理掉引用的废弃对象也会一直存活,容易造成oom。
七.避免使用中介方法(finalizer)
1.总结方法依赖于虚拟机回收对象的时间,执行时间是不确定的。
2.总结方法不保证一定被执行完成。
3.在总结方法中抛出的未被捕获的异常将被忽略,可能导致对象处于不正常的状态。
4.使用终结方法有非常严重的性能损失。
5.要清理回收对象使用的资源,可以考虑提供一个显示的清理方法,让客户端程序在try catch finally 块的finally中执行这个清理方法。
6.终结方法的一个用处是客户端在忘记调用上述终结方法时调用。
7.终结方法可以用来清理本地对等体中的资源。