代码改变世界

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

  ttylinux  阅读(443)  评论(0编辑  收藏  举报

场景:

在创建工具类的时候,大部分是无需实例化的,实例化对它们没有意义。在这种情况下,创建的类,要确保它是不可以实例化的。
 
存在问题:
在创建不可实例化的类时,虽然没有定义构造器。但是,客户端在使用该类的时候,依然可以实例化它。客户端,可以继承该类,通过实例化其子类来实现实例化;客户端可以调用默认的构造器来实例化该类。
 
要避免这个问题,使用的方式是,定义一个私有的构造器:
1
2
3
4
5
6
public class UtilityClass {
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}
添加 throw new AssertionError(),是避免在UtilityClass实例化UtilityClass类。
因为有了私有的无参构造器,这样客户端就没有办法调用默认构造器来实例化该类;也避免了继承的子类被实例化的问题。
 
比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UtilityClass {
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
 
    public static UtilityClass getInstance()
    {
        return new UtilityClass ();
    }
}
 
public class Test {
 
    public static void main(String[] args)
    {
 
        UtilityClass one = UtilityClass .getInstance();
    }
}
上述代码执行了之后,会报如下错误:
Exception in thread "main" java.lang.AssertionError
       at org.effectivejava.examples.chapter02.item04.UtilityClass.<init>(UtilityClass.java:8)
       at org.effectivejava.examples.chapter02.item04.UtilityClass.getInstance(UtilityClass.java:13)
       at org.effectivejava.examples.chapter02.item04.Test.main( Test.java:9)
 
添加throw new AssertionError()可以成功避免在UtilityClass中实例化UtilityClass类。
可以成功避免如下代码执行:
1
2
3
public class SubUtilityClass extends UtilityClass {
 
}
当试图继承该类时,会提示如下错误:
Implicit super constructor UtilityClass() is not visible for default constructor. Must define an explicit constructorImplicit super constructor UtilityClass() is not visible for default constructor. Must define an explicit constructor
客户端也无法调用默认的构造器。
1
2
3
4
5
6
7
8
public class Test {
 
    public static void main(String[] args)
    {
 
       // UtilityClass one = new UtilityClass();
    }
}

  

编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示