4

我正在经历有效的Java。第一项为静态工厂方法优于构造函数提供了一个令人信服的案例。

我没有得到第一个缺点是

仅提供静态工厂方法的主要缺点是不能对没有公共或受保护构造函数的类进行子类化。

为什么我需要对具有静态工厂方法的类进行子类化,因为静态方法不能被继承?

有人可以解释一下。

4

5 回答 5

7

假设您有一个名为的类Person

class Person {
  public static Person createWithFirstName(String firstName) {
    return new Person(firstName, null, null);
  }
  // etc. - more factory methods

  // private constructor
  private Person(String firstName, String lastName, String nickname) { }

  // useful method
  public String getDisplayName() { }
}

这一切都很好,花花公子。但是现在您还需要一个名为 的类Programmer,您突然意识到程序员也是人!

但是突然之间,你不能只是

class Programmer extends Person { }

因为Person没有任何public构造函数。

于 2013-11-01T19:44:54.097 回答
2

要创建子类的实例,必须调用其构造函数。

构造函数必须做的第一件事是调用它的一个父类构造函数(super()如果你没有明确添加它,编译器会为你插入一个调用)。

如果所有的父类构造函数都是私有的,子类就不能调用它们中的任何一个,使得父类实际上是最终的,即不可能子类化。

于 2013-11-01T19:16:30.580 回答
1

几个事实

  • 在子类中,每个构造函数必须在调用超类构造函数的构造函数开始时调用super(..)..可能是参数)。
  • 要实现正确的静态工厂模式,所有具有此模式的类的构造函数都必须private防止在不使用工厂方法的情况下实例化类。

因此,由于带有工厂方法的基类的构造函数必须是私有的,派生类将无法调用super(..),这不会让子类编译。

于 2013-11-01T19:35:37.380 回答
0

这意味着你的类将不支持某些继承特性,例如你不能重写它的任何方法,你不能将它用作动态调度的超类型。

于 2013-11-01T19:39:30.483 回答
0

当你instantiate创建一个base类时,发生的第一件事就是调用它的parent类的构造函数。如果它parent class constructor是私有的,则不能从类主体外部调用它,因此将不起作用。请记住,当您阅读有关内容inheritance时,有一点表明如果您想使用super()它应该在基类构造函数的第一行,如果您没有super()在基类中显式使用,编译器会自动将它放在那里。想想如果你的parent class constructoris会发生什么privatesuper()呼叫将失败。

于 2013-11-01T19:20:33.377 回答