Java最终抽象类

Sau*_*uer 38 java final class abstract

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

我想要一个Java类,它提供了一个公共静态方法,它可以做一些事情.这仅用于封装目的(在一个单独的类中包含所有内容)...

这个类既不应该被实例化,也不应该被扩展.这让我写道:

final abstract class MyClass {
   static void myMethod() {
      ...
   }
   ... // More private methods and fields...
}
Run Code Online (Sandbox Code Playgroud)

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

我也知道,我可以使这个类完全是final,并覆盖标准构造函数,同时将其设为私有.

但在我看来,这更像是一种"解决方法",并且应该更有可能通过最终的抽象类来完成......

而且我讨厌变通方法.所以只是为了我自己的兴趣:还有另一种更好的方法吗?

Pet*_*rey 51

你不能比enum没有实例的东西简单得多.

public enum MyLib {;

   public static void myHelperMethod() { }
}
Run Code Online (Sandbox Code Playgroud)

这个类是final的,显式没有实例和私有构造函数.

这由编译器检测,而不是作为运行时错误.(与抛出异常不同)

  • 这是完美的解决方案.我不明白为什么人们不投票. (8认同)
  • 它确实意味着该类型确实带有一些相当奇怪的静态和实例方法. (6认同)
  • Peter Lawrey 1 - 0 Joshua Bloch ;-)(有趣的是,当JB提倡对单身人士如此强烈地使用枚举时,JB没有提及) (4认同)
  • @Sauer如果你不使用方法,他们没有头脑.值得考虑一下你不需要的开销编写代码. (4认同)
  • 使用枚举比接受的解决方案更好,因为它不会留下单元测试无法覆盖的无法访问的代码(除非使用反射) (4认同)
  • @AlexR出于同样的原因,我也使用enum作为单身人士.您明确说明可以有多少个实例.`enum`可以在单例的情况下扩展接口. (2认同)

ass*_*ias 46

参考:有效的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() {}
}
Run Code Online (Sandbox Code Playgroud)

  • @LuiggiMendoza这是_not_单身模式.这里根本没有实例. (39认同)

Sle*_*led 6

不,你应该做的是创建一个私有空构造函数,在它的主体中抛出异常.Java是一种面向对象的语言,一个永远不会被实例化的类本身就是一种解决方法!:)

final class MyLib{
    private MyLib(){
        throw new IllegalStateException( "Do not instantiate this class." );
    }

    // static methods go here

}
Run Code Online (Sandbox Code Playgroud)