使类抽象vs使构造函数私有

时间:2015-04-13 07:18:54

标签: java oop

我心中有一个设计问题。假设我有一个只有静态方法的类,那么下面两个中最好的设计选项。

  • 使课程抽象
  • 使构造函数成为私有的,这样就没有代码了 class可以创建这个类的对象。

选择取决于具体情况还是有最好的方法?为什么?

5 个答案:

答案 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。在这种情况下,即使将来有人公开,他也不能在不改变代码的情况下调用它。