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的,显式没有实例和私有构造函数.
这由编译器检测,而不是作为运行时错误.(与抛出异常不同)
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)
不,你应该做的是创建一个私有空构造函数,在它的主体中抛出异常.Java是一种面向对象的语言,一个永远不会被实例化的类本身就是一种解决方法!:)
final class MyLib{
private MyLib(){
throw new IllegalStateException( "Do not instantiate this class." );
}
// static methods go here
}
Run Code Online (Sandbox Code Playgroud)