我有一个类,提供一些静态的实用方法集合。
一方面,我不希望这个类可以被实例化。另一方面,我也不想传达这个信号:这个类应该被继承(虽然我认为这种情况不太可能发生)。
那么,这个类应该是抽象类吗?
我有一个类,提供一些静态的实用方法集合。
一方面,我不希望这个类可以被实例化。另一方面,我也不想传达这个信号:这个类应该被继承(虽然我认为这种情况不太可能发生)。
那么,这个类应该是抽象类吗?
将该类声明为final
,并将默认构造函数声明为private
,不提供任何public
构造函数。这样就没有人能够子类化它或创建该类的实例。
abstract
; 声明一个private
构造函数,这样甚至是子类也不能实例化您的实用程序类。final
,尽管如果所有构造函数都是private
,那么任何人都无法对其进行子类化。setAccessible
方法在 AccessibleObject中允许实例化:public class MyUtility
{
private MyUtility()
{
throw new RuntimeException("Instantiation of MyUtility is not allowed!");
}
public static void utilityMethod()
{
// Your utility method here.
}
}
虽然顶级类不能被声明为static
,但是通过将默认构造函数声明为private
,可以使该类对其他类不可实例化(实际上是“静态的”),从而达到与static
类似的效果。
enum MyClass{
;//this semicolon indicates that this enum will have no instances
//now you can put your methods
public static void myMethod(){
//...
}
}
默认情况下,枚举是final的,并且其构造函数是私有的。此外,您无法使用反射创建其实例,因为它在Constructor#newInstance中检查您是否正在实例化枚举对象。
public final class Utils
{
// prevent accidental construction.
private Utils()
{
}
public static void foo()
{
//util code here
}
}
类中包含的内容与其是否应该是抽象类无关。关键是:抽象类必须有另一个类扩展它(一个“具体”类);只有该具体类可以被实例化。
要防止它被扩展,请使用final
。
要防止它被实例化,请将构造函数设为private
。
请注意,在Java中,这些是不同的概念。
真的,你不必做任何事情。不会发生任何不好的事情,也没有人会实例化/子类化你的类。