私有构造方法强制不可实例化的性质

举报
JavaEdge 发表于 2021/06/04 00:47:30 2021/06/04
【摘要】 有时想编写只有静态方法和静态字段的类。这种类很不好,因为有些人滥用在OOP 语言编写面向过程的程序,但确有用途。 可用 java.lang.Math 或 java.util.Arrays 这种类,把基本类型的值或数组类型的方法组织起来。 还可以用于对以 java.util.Collections 的方式,把实现特定接口的对象上的静态方法组织起来。( Java 8,可以将...

有时想编写只有静态方法和静态字段的类。这种类很不好,因为有些人滥用在OOP 语言编写面向过程的程序,但确有用途。
可用 java.lang.Math 或 java.util.Arrays 这种类,把基本类型的值或数组类型的方法组织起来。
还可以用于对以 java.util.Collections 的方式,把实现特定接口的对象上的静态方法组织起来。( Java 8,可以将这些方法放入接口中,假设是你自己编写的可以修改)。最后,这些类还可把 final 类上的方法组织,因为不能将它们放在子类。

这样的工具类不是为实例化而设计:实例毫无意义。然而没有显式构造方法时,编译器会提供无参默认构造方法。对用户来说,这个构造方法与其他构造方法没区别。在已发布的 API 中看到无意中实例化的类很常见。

通过使类抽象来强制不可实例化是行不通的。 该类可被子类化,进而实例化子类。还会误导用户认为类是为继承而设计的。
然而,有一个简单的操作确保不可实例化。只有当类不包含显式构造方法时,才会生成默认构造方法,因此可以通过包含私有构造方法使类不可实例化:

因显式构造方法私有,在类外不可访问。AssertionError 不是严格要求的,但提供了保障,以防构造方法意外地被调用(比如反射!)。保证类在任何情况下都不会被实例化。
这个习惯用法有点违反常规,因为构造方法是明确提供的,但却不能调用它。因此,通常加个注释说明就是很好的做法。

也防止了类被子类化,这算是一个副作用吧。
所有子类构造方法都必须调用超类构造方法,无论是显式的还是隐式的,但这种情况下子类却没有可访问的超类构造方法可调用。

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/107454676

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。