我心中有一个设计问题。假设我有一个只有静态方法的类,那么下面两个中最好的设计选项。
选择取决于具体情况还是有最好的方法?为什么?
答案 0 :(得分:9)
创建类摘要假定您想要继承此类。如果你想要这样做,那就把它抽象化。
如果您只有静态方法(因此它是某种实用类),那么请使用第二种方法。
虽然创建这个类的实例没有任何问题,因为这样没有任何好处或缺点,最好的做法是使构造函数对于实用程序类是私有的。
答案 1 :(得分:4)
让我们看看标准类的开发人员做了什么:
public class Arrays {
// Suppresses default constructor, ensuring non-instantiability.
private Arrays() {
}
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
}
我在这里看到了一种模式。
这是有道理的,因为抽象类意味着该类应该是子类,而当您的类是仅具有静态方法的实用程序类时则不是这种情况。
答案 2 :(得分:4)
我认为更好的方法是使用私有构造函数创建final类。因为抽象类的目的是作为子类的基础。
答案 3 :(得分:2)
私有构造函数肯定。通常,只使用 静态方法的类应为:
public final class Utility {
public static void foo() { }
// ... etc.
}
如果你宣布它是抽象的,那么假设你打算继承它是合理的,而你的描述并非如此。
最终声明确保无法扩展。
答案 4 :(得分:1)
我会说“两个”。
使类抽象化可防止潜在用户使用反射创建其实例。它保证用户注意这是纯实用程序类,不应该实例化。
抽象类的构造函数永远不应该是公共的。如果class专用于扩展,那么构造函数应该受到保护,因为它无论如何只能由子类使用。但是你的班级不能继承。因此它的构造函数只能是私有的。而且,为了安全起见,构造函数可以抛出IllegalStateException
。在这种情况下,即使将来有人公开,他也不能在不改变代码的情况下调用它。