Java:Static Class?

2022-08-31 08:13:01

我有一个充满实用程序函数的类。实例化它的实例没有语义意义,但我仍然想调用它的方法。处理这个问题的最佳方法是什么?静态类?抽象?


答案 1

标记为 final 的类上的私有构造函数和静态方法。


答案 2

根据伟大的著作“Effective Java”

项目 4:使用私有构造函数强制实施不稳定性

- 试图通过使类抽象来强制非实例性是行不通的。

- 仅当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使类不可验证:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

由于显式构造函数是私有的,因此在类外部无法访问它。AssertionError不是严格要求的,但它提供了保险,以防从类中意外调用构造函数。它保证该类在任何情况下都不会被实例化。这个成语有点违反直觉,因为构造函数是明确提供的,因此无法调用它。因此,如上所述,最好包括注释。

作为副作用,此成语还可以防止类被子类化。所有构造函数都必须显式或隐式调用超类构造函数,并且子类没有可访问的超类构造函数可调用。