原文地址: itweknow.cn/detail?id=5… ,欢迎你们访问。java
在实际的搬砖过程当中,咱们常常会写一些方便咱们工做的工具类,通常来说这类工具类是不但愿被实例化的,由于实例对他们来说没有任何的意义,毕竟它们不存储任何的数据。工具
这应该是咱们编写工具类的时候最多见的了,由于不须要实例化,因此咱们通常都懒得去编写构造方法,可是咱们忽略了编译器会为其提供一个默认的无参构造器,对于用户而言这个构造器和其余构造器没有任何区别。并且咱们会发如今实际编码中咱们有时候会无心识地实例化这些类。形成了资源的浪费。编码
或许咱们会想到经过抽象类来强制这种工具类不被实例化,可是这是行不通的。由于该类能够被子类化,而且该类的子类能够被实例化,这样作还可能会误导用户,觉得这种类是专门为继承而设计的。spa
Java编译器只有当类不包含显式构造器的时候才会生成缺省构造器,因此咱们只须要让这个类包含一个私有的显式构造器,它就不能被实例化了。设计
public class Example {
public static void test() {}
public static void test2() {}
private Example() {
}
}
复制代码
看过上一条的同窗应该知道,咱们能够经过反射来强制调用私有构造器进而得到该类的实例,因此还须要改进一下。code
public class Example {
public static void test() {}
public static void test2() {}
private Example() {
throw new AssertionError();
}
}
复制代码
虽然通常来说,AssertionError
并非必须的,可是这样能够避免咱们不当心在类内部调用构造器也能够防止用户经过反射来获取新实例。继承