Item 4 ----通过私有构造器强化不可实例化的能力
2015-03-21 16:35 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(); } } |
版权声明:
作者:ttylinux
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)