Java 最终抽象类

2022-09-01 01:16:27

我有一个非常简单的问题:

我想要一个Java类,它提供一个公共静态方法,它可以做一些事情。这只是为了封装目的(将所有重要的东西都放在一个单独的类中)...

此类既不应实例化,也不应扩展。这让我写道:

final abstract class MyClass {
   static void myMethod() {
      ...
   }
   ... // More private methods and fields...
}

(虽然我知道,这是被禁止的)。

我也知道,我可以使这个类完全是最终的,并覆盖标准构造函数,同时使其私有。

但在我看来,这更像是一个“解决方法”,应该更有可能由最终的抽象类来完成......

我讨厌变通办法。所以只是为了我自己的利益:有没有另一个更好的方法?


答案 1

没有比使用没有实例的 更简单了。enum

public enum MyLib {;

   public static void myHelperMethod() { }
}

此类是最终类,显式没有实例和私有构造函数。

这是由编译器检测到的,而不是作为运行时错误检测到的。(与引发异常不同)


答案 2

参考:有效的 Java 第 2 版第 4 项“使用私有构造函数强制实施不稳定性”

public final class MyClass { //final not required but clearly states intention
    //private default constructor ==> can't be instantiated
    //side effect: class is final because it can't be subclassed:
    //super() can't be called from subclasses
    private MyClass() {
        throw new AssertionError()
    }

    //...
    public static void doSomething() {}
}