一个只有静态方法的类应该是抽象的吗?

时间:2013-02-15 00:34:03

标签: java

我有一个提供静态实用程序类型方法的集合。

一方面,我不希望该类能够被实例化。另一方面,我不想传递该类应该继承的信号(不是我认为它很可能)。

这个班级应该是抽象的吗?

8 个答案:

答案 0 :(得分:11)

创建类final并创建默认构造函数private,并且不提供任何public构造函数。这样,没有人可以将其子类化或创建它的实例。

答案 1 :(得分:6)

不要声明它abstract;声明一个private构造函数,所以没有人,甚至是子类,都不能实例化你的实用程序类的实例。

您可以声明您的班级final,但如果所有构造函数都是private,那么无论如何都没有人能够对它进行子类化。

在另一个答案中借用Pshemo的注释中的想法,在构造函数中抛出一个RuntimeException,以防止AccessibleObject中的反射setAccessible方法允许实例化:

public class MyUtility
{
   private MyUtility()
   {
      throw new RuntimeException("Instantiation of MyUtility is not allowed!");
   }

   public static void utilityMethod()
   {
      // Your utility method here.
   }
}

答案 2 :(得分:3)

虽然不能声明顶级类static,但是通过声明默认构造函数,可以使类不可实例化(实际上是静态')到其他类private,禁止实例化,因为没有构造函数可见。

答案 3 :(得分:2)

另一版@mre's answer

enum MyClass{
    ;//this semicolon indicates that this enum will have no instances

    //now you can put your methods
    public static void myMethod(){
        //...
    }
}

默认情况下,枚举是final,其构造函数是私有的。此外,您无法使用反射创建其实例,因为如果您尝试实例化Enum对象,它会检入Constructor#newInstance

答案 4 :(得分:1)

一个类中包含的内容与它是否应该是抽象无关。关键要点:抽象类必须有另一个类扩展它(一个'具体'类);只有具体的类可以实例化。

要防止扩展,请使用final

要防止它被实例化,请创建构造函数private

在Java中观察到这些是离散的概念。

答案 5 :(得分:1)

不,这是一个实用工具 它应该是finalprivate默认构造函数,以避免实例化。 如果您启用了checkstyle,那么如果您不这样做,则会收到警告。

答案 6 :(得分:1)

除了为类赋予私有构造函数的所有其他调用之外,您还应该将其设置为final,以便明确没有任何内容可以对其进行子类化。

public final class Utils
{
    // prevent accidental construction.
    private Utils() 
    {  
    } 

    public static void foo()
    { 
        //util code here
    }
}

答案 7 :(得分:1)

说真的,你不必做任何事情。没有什么不好的事情会发生,没有人会实例化/继承你的班级。