java 只有静态方法的类应该是抽象的吗?

n3schb8v  于 2024-01-05  发布在  Java
关注(0)|答案(8)|浏览(177)

我有一个类,它提供了一个静态实用程序类型方法的集合。
一方面,我不希望类能够被示例化,另一方面,我不想发出应该继承类的信号(我不认为这是可能的)。
这个类是否应该是抽象的?

vuv7lop3

vuv7lop31#

使类final和默认构造函数private,不提供任何public构造函数。这样就没有人可以子类化它或创建它的示例。

tgabmvqs

tgabmvqs2#

不要将其声明为abstract;声明一个private构造函数,这样任何人,甚至子类,都不能示例化您的实用程序类的示例。
你可以声明你的类final,尽管如果所有的构造函数都是private,那么无论如何都没有人能够继承它。
借用Pshemo在另一个答案中的评论的想法,在构造函数中抛出RuntimeException以防止反射的AccessibleObject中的setAccessible方法允许示例化:

  1. public class MyUtility
  2. {
  3. private MyUtility()
  4. {
  5. throw new RuntimeException("Instantiation of MyUtility is not allowed!");
  6. }
  7. public static void utilityMethod()
  8. {
  9. // Your utility method here.
  10. }
  11. }

字符串

展开查看全部
6tr1vspr

6tr1vspr3#

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

du7egjpx

du7egjpx4#

说真的,你不需要做任何事情。没有什么不好的事情会发生,没有人会示例化/子类化你的类。

pnwntuvh

pnwntuvh5#

@mre的answer的另一个版本

  1. enum MyClass{
  2. ;//this semicolon indicates that this enum will have no instances
  3. //now you can put your methods
  4. public static void myMethod(){
  5. //...
  6. }
  7. }

字符串
默认情况下,Enum是final的,它的构造函数是private的。此外,你不能用反射创建它的示例,因为如果你试图示例化Enum对象,它会检查Constructor#newInstance。

stszievb

stszievb6#

一个类中包含的内容与它是否应该是抽象的无关。关键是:一个抽象类 * 必须 * 有另一个类扩展它(一个“具体”类);只有那个具体类才能被示例化。
要防止它被扩展,请使用final
为了防止它被示例化,构造函数为private
注意,在Java中,这些是离散的概念。

f5emj3cl

f5emj3cl7#

不,它是一个实用程序类。
它应该是final,带有一个private默认构造器,以避免示例化。如果你启用了checkstyle,如果你不这样做,你会得到一个警告。

fnvucqvd

fnvucqvd8#

除了所有其他调用给类给予一个私有构造函数之外,还应该使它成为final,这样就可以清楚地表明没有什么可以子类化它。

  1. public final class Utils
  2. {
  3. // prevent accidental construction.
  4. private Utils()
  5. {
  6. }
  7. public static void foo()
  8. {
  9. //util code here
  10. }
  11. }

字符串

相关问题