本文共 900 字,大约阅读时间需要 3 分钟。
参考:Effective Java 第二版 第二章
有时候,可能需要编写只包含静态方法和静态域的类。这样的工具类不希望被实例化,实例对它没有任何意义。然而,在缺少显式构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器。
企图通过将类做成抽象类来强制该类不可被实例化是行不通的。该类可以被继承,子类可以被实例化,会误导用户以为这种类是专门为了继承而设计的。
只要让类包含私有构造器,就不可以被实例化了。保证该类在任何情况下都不会实例化。
这种习惯用法的副作用是,使得一个类不能被子类化,所有的构造器必须显式或隐式调用超类构造器,在这种情况下,子类就没有可以访问的超类构造器可以调用。
一般来说,最好重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又流行。如果对象是不可变的,它就始终可以被重用。
对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。
除了重用不可变的对象之外,也可以重用哪些已知不会被修改的可变对象。
考虑适配器情形,适配器:把功能委托给一个后备对象,从而为后备对象提供一个可以替代的接口。由于适配器除了后备对象之外没有其他的状态信息,所以针对某个给定对象的特定适配器而言,不需要创建多个适配器实例。
要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
小对象的构造器只做很少量的显式工作,小对象的创建和回收是非常廉价的。通过创建附加对象,提升程序的清晰性、简洁性和功能性。
通过维护自己的对象池来避免创建对象并不是一种好的做法,除非池中的对象是非常重量级的。一般而言,维护自己的对象池必定会把代码弄得很乱,同时增加内存占用,并且还会损害性能。现代的JVM实现具有高度优化的垃圾回收,其性能很容易就会超过轻量级对象池的性能。
注意,在提倡使用保护性拷贝的时候,因重用对象而付出的代价要远远大于因创建重复对象而付出的代价。必要时如果没能实施保护性拷贝,将会导致潜在的错误和安全漏洞,而不必要的创建对象只会影响程序的风格和性能。
转载地址:http://qgyai.baihongyu.com/