我有一个提供静态实用程序类型方法的集合。
一方面,我不希望该类能够被实例化。另一方面,我不想传递该类应该继承的信号(不是我认为它很可能)。
这个班级应该是抽象的吗?
答案 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)
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)
不,这是一个实用工具
它应该是final
和private
默认构造函数,以避免实例化。
如果您启用了checkstyle,那么如果您不这样做,则会收到警告。
答案 6 :(得分:1)
除了为类赋予私有构造函数的所有其他调用之外,您还应该将其设置为final,以便明确没有任何内容可以对其进行子类化。
public final class Utils
{
// prevent accidental construction.
private Utils()
{
}
public static void foo()
{
//util code here
}
}
答案 7 :(得分:1)
说真的,你不必做任何事情。没有什么不好的事情会发生,没有人会实例化/继承你的班级。