Java 高效代码

来源:互联网 发布:怎么才能通过网络赚钱 编辑:程序博客网 时间:2024/06/03 19:57

考虑用静态工厂方法代替构造器:

优点:
    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》

0 0
原创粉丝点击