如果我不想实例化一个类,我有什么选择?

时间:2013-12-31 15:00:50

标签: java instantiation

我有一个包含所有静态方法的类,基本上可以调用ClassName#MethodName()

我希望此类始终不可实例化,因此我将构造函数可见性设置为private。这当然避免了从类外部创建它的任何实例。 我想知道是否有任何技术术语或任何专门设计用于完成我不知道的设计模式。

这也不会阻止我或任何其他开发人员在同一个类中实例化它。我想知道是否有可能阻止这样做,但保持相同的类行为。另外,还有哪些其他选项?

4 个答案:

答案 0 :(得分:4)

我只使用enum该类为final,它是构造函数private,即使通过反射也无法实现。

public enum Utility {;
    public static void staticMethod() {
        // do something
    }
}

使用enum允许您定义一个类的所有可能实例,并且因此您已经定义了不能有任何实例。

答案 1 :(得分:4)

我会这样写:

public class MyClass{
// Suppress default constructor for noninstantiability
    private MyClass(){
          throw new AssertionError();
    }
          . . . . . 
          . . . . . 
          . . . . . 
}

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

source

答案 2 :(得分:3)

我认为最好的方法是使用private构造函数,如你所说:

public final class MyClass {    

    private MyClass() {}

    public static void do() {}
}

并将其设为final,因此没有人可以扩展您的课程。

答案 3 :(得分:2)

使构造函数成为私有,最后是类。