【Effective Java】Ch2_创建销毁对象:Item4_通过私有构造函数来强化不可实例化的能力
2013-01-21 15:32
330 查看
偶尔情况下,你会编写只包含静态方法和静态域的类。这种类的名声不太好,因为有些人滥用他们来避免面向对象编程,不过这种类确实有他们的用处。
我们可以照java.lang.Math或java.util.Arrays的样子,用这种类将基本类型或数组上相关的方法组织起来;
还可以照jva.util.Collections的样子,将实现了特定接口的对象中的静态方法(包括静态工厂方法)组织起来;
最后,这种类可以用来将final类中的方法组织起来,以取代扩展该final类。
这种工具类设计出来并不是为了实例化它,工具类的实例是无意义的。然而,如果不显式地编写构造函数,编译器则会提供一个公共的无参数的默认构造方法。对用户来说,这种构造方法和其他构造函数没有任何区别。我们经常能在已发行的API中看到这种不经意的可实例化的类。
企图通过将类定义为抽象类来强制该类不可实例化,是不可行的。因为类可被子类化,而子类可以实例化。此外,这会误导用户一位这个类是设计来继承的(Item17)。然而,一种简单的习惯用法即可确保类不可实例化。只有当类中没有显式的构造函数,编译器才会生成默认构造函数,所以,只要类中包含私有构造函数即可保证不可实例化:
这种习惯用法的副作用是类不能被子类化了。子类的所有构造函数必须首先隐式或显式地调用父类构造函数,而在这种用法下,子类就没有可访问的父类构造函数可调用了。
我们可以照java.lang.Math或java.util.Arrays的样子,用这种类将基本类型或数组上相关的方法组织起来;
public class Arrays { public static void fill(long[] a, long val) { ... } }
还可以照jva.util.Collections的样子,将实现了特定接口的对象中的静态方法(包括静态工厂方法)组织起来;
public class Collections { public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) { ... } }
最后,这种类可以用来将final类中的方法组织起来,以取代扩展该final类。
这种工具类设计出来并不是为了实例化它,工具类的实例是无意义的。然而,如果不显式地编写构造函数,编译器则会提供一个公共的无参数的默认构造方法。对用户来说,这种构造方法和其他构造函数没有任何区别。我们经常能在已发行的API中看到这种不经意的可实例化的类。
企图通过将类定义为抽象类来强制该类不可实例化,是不可行的。因为类可被子类化,而子类可以实例化。此外,这会误导用户一位这个类是设计来继承的(Item17)。然而,一种简单的习惯用法即可确保类不可实例化。只有当类中没有显式的构造函数,编译器才会生成默认构造函数,所以,只要类中包含私有构造函数即可保证不可实例化:
// Noninstantiable utility class public class UtilityClass{ // Suppress default constructor for noninstantiability private UtilityClass(){ throw new AssertionError(); } }由于显式的构造函数是私有的,所以在类的外部不可访问该方法。AssertionError并不是必须的,不过它确保了该方法不会再类内部被意外调用,它确保了在任何情况下该类都不会被实例化。这种习惯用法有点违背直觉,因为明明已提供了构造函数,但却不能被调用。所以,聪明的做法是增加一条注释,如上例所示。
这种习惯用法的副作用是类不能被子类化了。子类的所有构造函数必须首先隐式或显式地调用父类构造函数,而在这种用法下,子类就没有可访问的父类构造函数可调用了。
相关文章推荐
- 【Effective Java】Ch2_创建销毁对象:Item3_通过私有构造函数或枚举类型来强化Singleton属性
- 创建和销毁对象 - 通过私有构造器强化不可实例化的能力
- Effective Jave 创建和销毁对象 4.通过私有构造器强化不可实例化的能力
- 通过私有构造器强化不可实例化的能力、避免创建不必要的对象、消除过期的对象引用
- Item 3:通过私有构造函数强化不可实例化的能力
- 4. 【创建和销毁对象】通过私有化构造方法强化不可实例化的能力
- Effective Java 中文版第二版的读书心得(四)通过私有构造器强化不可实例化的能力
- 【Effective Java】Ch2_创建销毁对象:Item1_考虑用工厂方法替代构造函数
- Effective Java -- 通过私有构造器强化不可实例化的能力
- Effective Java 第4条:通过私有构造器强化不可实例化的能力
- Effective Java 读书笔记(四):通过私有构造器强化不可实例化的能力
- Item 4 ----通过私有构造器强化不可实例化的能力
- 【Effective Java】Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder
- 通过私有构造函数强化不可实例化的能力
- 第4条:通过私有构造函数强化不可实例化的能力
- 《Effective java》读书记录-第4条-通过私有构造器强化不可实例化的能力
- Java性能优化(3):通过私有构造函数强化不可实例化的能力
- 通过私有构造器强化不可实例化的能力
- 04、通过私有构造器强化不可实例化的能力
- Java学习笔记4:通过私有构造器强化不可实例化的能力