此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。
既然有缘看到此文,那么希望能对你有所帮助。
本文对应原书第4条 通过私有构造器强化不可实例化的能力
很多时候,我们会用到只有静态方法和静态域的类:
public class Demo {
public static final String NAME = "Dash"
public static boolean test(String name) {
return NAME.equals(name);
}
}
其实按照Java面向对象
的思想来说,很容易滥用这样的类来编写面向过程
的程序。但这种类型的类确实有特别的用处,也就是作为工具类(utility class
)。在Java中常用的java.lang.Math
、java.util.Arrays
、java.util.Collections
等都是这种性质。
这种类的存在并没有任何问题,但却因为使用者很多时候也会使用到如new XXX().test()
的方式使用某个功能,所以在使用工具类时,常常会因为混淆将不需要实例化的工具类实例化之后再进行使用。
对于这样毫无意义的实例化,我们就需要主动为工具类提供一个私有的构造器,
毕竟你不主动(一个构造器都没写),编译器就会自觉的给你加上一个public
的无参构造器。
public class Demo {
// 私有构造器
private Demo() { }
...
}
当然如果你的项目中使用了lombok
,你也可以这么写,虽然并不推荐:
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Demo {
...
}
总结
记得给项目里的工具类手动加上私有构造器。
另外注意,加上以后这个类就不能被继承了,但是,反正一般工具类也不需要继承。
水平有限,若文章中存在错误,恳请不吝赐教,这对我以及后面的读者都有重要意义;
若文章能够帮助到你,还望一键三连,你的支持,是我最大的动力。