我有一个提供静态实用程序类型方法集合的类。
一方面,我不希望类能够被实例化。另一方面,我不想发送应该继承类的信号(不是我认为它可能)。
这个类应该是抽象的还是不抽象的?
制作类final
并制作默认构造函数private
,并且不提供任何public
构造函数。这样,没有人可以继承它或创建它的实例。
不要声明它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.
}
}
尽管无法声明顶级类static
,但您可以通过声明默认构造函数使该类对其他类不可实例化(实际上是“静态”),该构造函数private
禁止实例化,因为没有构造函数可见。
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 。
说真的,你不必做任何事情。不会发生任何不好的事情,没有人会实例化/子类您的类。
一个类中包含的内容与它是否应该是抽象的无关。关键是:一个抽象类必须有另一个类扩展它(一个“具体”类);只有那个具体的类可以被实例化。
为防止它被扩展,请使用final
.
为了防止它被实例化,请创建构造函数private
。
请注意,在 Java 中,这些是离散的概念。
不,它是一个实用程序类。
它应该final
使用private
默认构造函数,以避免实例化。如果您启用了 checkstyle,如果您不这样做,您会收到警告。
除了为类提供私有构造函数的所有其他调用之外,您还应该将其设为 final,以便清楚地知道没有任何东西可以子类化它。
public final class Utils
{
// prevent accidental construction.
private Utils()
{
}
public static void foo()
{
//util code here
}
}