9

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

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

这个类应该是抽象的还是不抽象的?

4

8 回答 8

13

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

于 2013-02-15T00:35:25.323 回答
8

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

你可以声明你的类final,尽管如果所有的构造函数都是private,那么无论如何都没有人能够继承它。

要从另一个答案中的 Pshemo 评论中借用这个想法,请在构造函数中抛出 RuntimeException 以防止AccessibleObjectsetAccessible中的反射方法允许实例化:

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

   public static void utilityMethod()
   {
      // Your utility method here.
   }
}
于 2013-02-15T00:35:23.950 回答
3

尽管无法声明顶级类static,但您可以通过声明默认构造函数使该类对其他类不可实例化(实际上是“静态”),该构造函数private禁止实例化,因为没有构造函数可见。

于 2013-02-15T00:36:27.363 回答
2

@mre 答案的另一个版本

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

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

默认情况下,枚举是最终的,其构造函数是私有的。你也不能用反射创建它的实例,因为如果你试图实例化 Enum 对象,它会检查Constructor#newInstance 。

于 2013-02-15T01:08:23.623 回答
1

说真的,你不必做任何事情。不会发生任何不好的事情,没有人会实例化/子类您的类。

于 2013-02-15T00:49:43.373 回答
1

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

为防止它被扩展,请使用final.

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

请注意,在 Java 中,这些是离散的概念。

于 2013-02-15T00:35:49.130 回答
1

不,它是一个实用程序类。
它应该final使用private默认构造函数,以避免实例化。如果您启用了 checkstyle,如果您不这样做,您会收到警告。

于 2013-02-15T00:35:59.127 回答
1

除了为类提供私有构造函数的所有其他调用之外,您还应该将其设为 final,以便清楚地知道没有任何东西可以子类化它。

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

    public static void foo()
    { 
        //util code here
    }
}
于 2013-02-15T00:38:35.893 回答