问题

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


#1 热门回答(157 赞)

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


#2 热门回答(91 赞)

根据伟大的书"Effective Java"
项目4:使用私有构造函数强制实现非实例化-尝试通过使类抽象来强制执行非实例化不起作用.-仅当类不包含显式构造函数时才生成默认构造函数,因此可以通过包含类来使类不可实现私有构造函数:

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

因为显式构造函数是私有的,所以它在类之外是不可访问的。 AssertionError不是严​​格要求的,但是如果在类中意外调用构造函数,它会提供保险。它保证在任何情况下都不会实例化该类。这个成语有点违反直觉,因为构造函数是明确提供的,因此无法调用它。因此,如上所示,包含评论是明智的。

作为副作用,这个习惯用法也会阻止类被子类化。所有构造函数必须显式或隐式地调用超类构造函数,并且子类将没有可调用的可访问超类构造函数。


#3 热门回答(20 赞)

听起来你有一个类似于java.lang.Math的实用程序类。
这种方法有最终类,包含私有构造函数和静态方法。

但要注意这对可测试性的作用,我建议阅读本文
Static Methods are Death to Testability


原文链接