我有一个类,它提供了一个静态实用程序类型方法的集合。一方面,我不希望类能够被示例化,另一方面,我不想发出应该继承类的信号(我不认为这是可能的)。这个类是否应该是抽象的?
vuv7lop31#
使类final和默认构造函数private,不提供任何public构造函数。这样就没有人可以子类化它或创建它的示例。
final
private
public
tgabmvqs2#
不要将其声明为abstract;声明一个private构造函数,这样任何人,甚至子类,都不能示例化您的实用程序类的示例。你可以声明你的类final,尽管如果所有的构造函数都是private,那么无论如何都没有人能够继承它。借用Pshemo在另一个答案中的评论的想法,在构造函数中抛出RuntimeException以防止反射的AccessibleObject中的setAccessible方法允许示例化:
abstract
setAccessible
public class MyUtility{ private MyUtility() { throw new RuntimeException("Instantiation of MyUtility is not allowed!"); } public static void utilityMethod() { // Your utility method here. }}
public class MyUtility
{
private MyUtility()
throw new RuntimeException("Instantiation of MyUtility is not allowed!");
}
public static void utilityMethod()
// Your utility method here.
字符串
6tr1vspr3#
虽然顶级类不能声明为static,但可以通过声明默认构造函数private使该类对其他类不可示例化(实际上是“静态”),该构造函数禁止示例化,因为没有构造函数可见。
static
du7egjpx4#
说真的,你不需要做任何事情。没有什么不好的事情会发生,没有人会示例化/子类化你的类。
pnwntuvh5#
@mre的answer的另一个版本
enum MyClass{ ;//this semicolon indicates that this enum will have no instances //now you can put your methods public static void myMethod(){ //... }}
enum MyClass{
;//this semicolon indicates that this enum will have no instances
//now you can put your methods
public static void myMethod(){
//...
字符串默认情况下,Enum是final的,它的构造函数是private的。此外,你不能用反射创建它的示例,因为如果你试图示例化Enum对象,它会检查Constructor#newInstance。
stszievb6#
一个类中包含的内容与它是否应该是抽象的无关。关键是:一个抽象类 * 必须 * 有另一个类扩展它(一个“具体”类);只有那个具体类才能被示例化。要防止它被扩展,请使用final。为了防止它被示例化,构造函数为private。注意,在Java中,这些是离散的概念。
f5emj3cl7#
不,它是一个实用程序类。它应该是final,带有一个private默认构造器,以避免示例化。如果你启用了checkstyle,如果你不这样做,你会得到一个警告。
fnvucqvd8#
除了所有其他调用给类给予一个私有构造函数之外,还应该使它成为final,这样就可以清楚地表明没有什么可以子类化它。
public final class Utils{ // prevent accidental construction. private Utils() { } public static void foo() { //util code here }}
public final class Utils
// prevent accidental construction.
private Utils()
public static void foo()
//util code here
8条答案
按热度按时间vuv7lop31#
使类
final
和默认构造函数private
,不提供任何public
构造函数。这样就没有人可以子类化它或创建它的示例。tgabmvqs2#
不要将其声明为
abstract
;声明一个private
构造函数,这样任何人,甚至子类,都不能示例化您的实用程序类的示例。你可以声明你的类
final
,尽管如果所有的构造函数都是private
,那么无论如何都没有人能够继承它。借用Pshemo在另一个答案中的评论的想法,在构造函数中抛出RuntimeException以防止反射的AccessibleObject中的
setAccessible
方法允许示例化:字符串
6tr1vspr3#
虽然顶级类不能声明为
static
,但可以通过声明默认构造函数private
使该类对其他类不可示例化(实际上是“静态”),该构造函数禁止示例化,因为没有构造函数可见。du7egjpx4#
说真的,你不需要做任何事情。没有什么不好的事情会发生,没有人会示例化/子类化你的类。
pnwntuvh5#
@mre的answer的另一个版本
字符串
默认情况下,Enum是final的,它的构造函数是private的。此外,你不能用反射创建它的示例,因为如果你试图示例化Enum对象,它会检查Constructor#newInstance。
stszievb6#
一个类中包含的内容与它是否应该是抽象的无关。关键是:一个抽象类 * 必须 * 有另一个类扩展它(一个“具体”类);只有那个具体类才能被示例化。
要防止它被扩展,请使用
final
。为了防止它被示例化,构造函数为
private
。注意,在Java中,这些是离散的概念。
f5emj3cl7#
不,它是一个实用程序类。
它应该是
final
,带有一个private
默认构造器,以避免示例化。如果你启用了checkstyle,如果你不这样做,你会得到一个警告。fnvucqvd8#
除了所有其他调用给类给予一个私有构造函数之外,还应该使它成为final,这样就可以清楚地表明没有什么可以子类化它。
字符串