前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >私有构造方法强制不可实例化的性质

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

作者头像
JavaEdge
发布2021-02-22 15:59:31
6520
发布2021-02-22 15:59:31
举报
文章被收录于专栏:JavaEdge

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档