考虑用静态工厂方法代替构造器:
优点:1.静态工厂方法有名称,可以直接阐明意图,解决多个构造函数给用户的困扰(需要查明api了解个参数含义,才能实例化)。
2.不必在每次调用时都创建一个新的对象。
3.它们可以返回原返回类型的任何子类型对象。 参考
4.在创建参数化类型实例的时候,它们使代码变得更加简洁。
缺点:
1.类如果不含有公共的或受保护的构造器,就不能被子类化。
2.它们与其他静态方法实际上没有任何区别。利用javadoc提供API时,并不能在文档中明确标识它,因此给查询实例化一个对象造成困难。
遇到多个构造器参数时要考虑用构建器:
优点:1.既能保证重叠构造器模式那样的安全性(线程安全),也能保持像Javabean模式那样好的可读性。
2.可以有多个可变参数。 参考
3.可以利用单个构建器构建多个不同对象。
4.设置了参数的builder生成了一个很好的抽象工厂。 参考
缺点:
为了创建对象,必须先创建构建器,在十分注重性能的情况下,构建器的开销可能就成为问题了。
用私有构造器或者枚举类型强化单例属性:
1:通过public final static字段实例化对象,保证了实例的全局唯一性。2:通过饿汉式或懒汉式创建单例对象时,该方式更加灵活。 参考
注意:利用1,2这两种方式创建单例时,可以通过反射机制调用私有构造器,破坏实例唯一性,如果要抵御这种攻击,可以修改构造器,让它在要求创建第二个实例时抛出异常。而且利用1,2这两种方式在反序列化实例时(实现了java序列化接口Serializable),也会破坏实例唯一性,如果要防止这种情况,则需要声明所有实例域都是瞬时的,而且要提供一个readResolver方法,该方法确保类的开发人员在序列化将会返回怎样的object上具有发言权,在序列化创建实例的时候被引用。[ 参考]。
3:通过枚举类型创建单例对象时,代码简洁,而且无偿提供了序列化机制,绝对防止多次实例化,杜绝攻击。
用私有化构造器强化不可实例化的能力
避免创建不必要的对象
1:对于同时提供了静态工厂方法和构造器的不可变类,通常使用静态工厂方法而不是构造器,以避免创建不必要的对象。2:优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
注意:当你应该重用现有对象的时候,请不创建新的对象。
覆盖equals方法时请遵循通用约定(自反性,一致性,对称性,传递性,非空性)
覆盖equals总要覆盖hashcode
始终覆盖toString方法
推荐阅读 《Effective Java》