繁体   English   中英

工厂方法构造Java对象:属性vs构造函数(通过方法)

[英]Java object construction by factory method: attribute vs constructor (via method)

我有一个类(A),它通过工厂方法(2)使用(1)另一个类(B):

(A)
public class MazeGame{
  private Room room;  // (1)

  public MazeGame() {
    this.room= makeRoom();   // (2)
  }

  protected Room makeRoom() {
    return new OrdinaryRoom();
  }
}

例如:

(B)
public class OrdinaryRoom{
  private String name = "ordinaryRoom";
}

我也可以将 (A) 写为:

(A2)
public class MazeGame{
  private Room room = makeRoom();  // (1)(2)

  protected Room makeRoom(){
    return new OrdinaryRoom();
  }
}

(A) 和 (A2) 有什么区别? 使用一个而不是另一个有一些优势吗?

我看到的差异:

  • 初始化room微小差异:对于(A),它在完成超级构造函数Object()调用后在MazeGame()构造函数内部进行MazeGame() 对于 (A2),初始化发生在完成超级构造函数Object()调用之后和任何MazeGame(...)构造函数的第一行之前。 在你的情况下,它没有区别。
  • (A2) 中的初始化适用于MazeGame将拥有的所有构造函数,而 (A) 方法仅在这个单个MazeGame()构造函数中初始化room ,不会影响您将来可能添加的任何构造函数。
  • 将初始化移动到room字段“允许”您从源代码中删除构造函数,并在没有构造函数的情况下依赖编译器生成的默认构造函数。 我不认为这是一种好处,而是一种维护风险,因为如果将来您想添加一些例如MazeGame(Room room)构造函数,这不仅会添加新的构造函数(预期结果),还会删除默认的 - 可能非常出乎意料。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM