一文读懂《Effective Java》第4条:通过私有构造器来强化工具类不可实例化的能力...

本文介绍了如何通过将工具类的构造器私有化来防止其实例化,这是一种常见的编程实践,有助于提高代码的安全性和可维护性。同时,文章也提到了这种方法的一个副作用:即阻止了该类被继承。

点击上方 蓝字 关注我们

随着计算机革命发展,“不安全”的编程方式逐渐成为编程代价高昂的主因之一。初始化和清理(cleanup)是涉及安全的两个问题

C++引入了构造器(constructor)的概念,这是一个创建对象时被自动调用的特殊方法,Java 也采用了构造器,并额外提供了“垃圾回收器”。

我们有可能需要编写一些工具类,它们只包含静态方法和静态域的类,而且这样的工具类(utility class)不希望被实例化,实例对它们没有任何意义。

工具类的不恰当声明

由于工具类不希望被实例化,然而在缺少显式构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器(default constructor)。对于用户而言,这个构造器与其它的构造器没有区别。

企图通过将类做成抽象类来强制该类不可被实例化,这是行不通的:因为这个类可以被子类化,并且也可以被实例化。所以,这样做会误导用户,让使用者误以为是为了继承而设计的。

工具类可以声明私有构造器

我们可以对工具类进行如下优化:

//不可实例化的工具类
public class UtinityClass {
  //显式声明一个私有化的构造器,使得无法实例化该类
  private UtinityClass() {
    throw new AssertionError();
  }
}

经过私有化构造器,外层实例化工具类的代码将会及时的发出错误提醒,从而达到不可实例化的目的(由于显式的构造器是私有的,所以不可以在该类的外部访问它):

总结

通过私有化构造器,来强化某些类的不可实例化能力。这种习惯做法也有副作用,它使得一个类不能被子类化。

因为子类化,要求子类所有的构造器都必须显式或者隐式的调用超类(superclass)构造器,而经过私有化该类构造器,导致想要继承于它的子类没有可访问的超类构造器可调用了。

往期推荐

一文带你读懂:系统线程模型与实现原理

一文读懂HTTP的前世今生

一文读懂JDK源码:Object 类

一文读懂JDK源码:BigDecimal 类

一文读懂JDK源码:String 类

Java并发编程实战:第1章 多线程安全性与风险

Java并发编程实战:第2章 线程安全性的原子性与加锁机制

Effective Java 第54条:谨慎的使用本地方法

Effective Java 第53条:接口优先于反射机制

Effective Java 第52条:通过接口引用对象

Effective Java 第48条:避免使用float和double

扫描二维码

获取技术干货

后台技术汇

点个“在看”表示朕

已阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值