Answers:
根据伟大的著作《有效的Java》:
第4项:使用私有构造函数强制执行不稳定性
-试图通过使类抽象化来强制不可例行性是行不通的。
-仅当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使该类不可实例化:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
由于显式构造函数是私有的,因此在类外部无法访问。并非严格要求AssertionError,但可以提供保证,以防在类中意外调用构造函数。它保证了在任何情况下都不会实例化该类。这个惯用法有点违反直觉,因为明确提供了构造函数,因此无法调用它。因此,明智的做法是添加一条评论,如上所述。
副作用是,此惯用法还防止类被子类化。所有构造函数都必须显式或隐式调用超类构造函数,并且子类将没有可调用的可访问超类构造函数。
AssertionError
了像其他的替代品IllegalStateException
,UnsupportedOperationException
等等?
听起来您有一个类似于java.lang.Math的实用程序类。
那里的方法是带有私有构造函数和静态方法的最终类。
但是要当心这对可测性的影响,我建议阅读这篇文章
静态方法是可测性的死亡
只是为了向上游游泳,静态成员和类并不参与OO,因此是邪恶的。不,不是邪恶的,但是认真地说,我建议使用具有单例模式的常规类进行访问。这样,如果您在任何情况下都需要覆盖行为,则不是主要的重组。OO是你的朋友:-)
我的$ .02
您可以从lombok https://projectlombok.org/features/experimental/UtilityClass使用@UtilityClass批注