此系列文章为本人对《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 {
...
}
总结
记得给项目里的工具类手动加上私有构造器。
另外注意,加上以后这个类就不能被继承了,但是,反正一般工具类也不需要继承。
水平有限,若文章中存在错误,恳请不吝赐教,这对我以及后面的读者都有重要意义;
若文章能够帮助到你,还望一键三连,你的支持,是我最大的动力。
本文探讨了如何通过私有构造器防止工具类被误实例化,避免面向过程编程的滥用,确保工具类如java.lang.Math的正确使用。文章强调了私有构造器的重要性,并提供了具体实现示例。
841

被折叠的 条评论
为什么被折叠?



