通过私有构造器强化不可实例化的能力

编写只包含静态方法和静态域的类,比如我们常写的Util类。我们不希望类被实例化,实例对它没有任何意义。
Java在缺少显式构造器的情况下,编译器会自动提供一个公有的,无参的缺省构造器,有潜在的被实例化的风险。
我们可以显式的指定一个私有的构造器,代码如下:

// Noninstantiable utility class
public class UtilityClass {

    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
    
}

AssertionError不是必需的,但是可以避免不小心在类的内部调用构造器,或者是反射攻击,保证了该类在任何情况下都不被实例化。
注意:没有公有的构造器,导致这个类不能被子类化,所有的构造器都必须显式或隐式的调用超类构造器。
另外,企图通过将类做成抽象类强制该类不可被实例化是行不通的。因为该类可以被子类化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容