Java 通过工厂方法构造对象:属性 vs 构造函数(通过方法)
Java object construction by factory method: attribute vs constructor (via method)
我有一个 class (A) 通过工厂方法使用 (1) 另一个 class (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()
构造函数。对于 (A2),初始化发生在完成超级构造函数 Object()
调用之后和任何 MazeGame(...)
构造函数的第一行之前。在你的情况下,这没有什么不同。
- (A2) 的初始化适用于
MazeGame
将永远拥有的所有构造函数,而 (A) 方法仅初始化 room
在此单个 MazeGame()
构造函数中,不影响您将来可能添加的任何构造函数。
- 将初始化移动到
room
字段 "allowed" 您可以从源代码中删除构造函数并 依赖默认构造函数 编译器在没有构造函数的情况下生成。我不认为这是一种好处,而是一种维护风险,因为如果将来你想添加一些,例如MazeGame(Room room)
构造函数,这不仅添加了新的构造函数(预期结果),而且还删除了默认构造函数 - 可能非常出乎意料。
我有一个 class (A) 通过工厂方法使用 (1) 另一个 class (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()
构造函数。对于 (A2),初始化发生在完成超级构造函数Object()
调用之后和任何MazeGame(...)
构造函数的第一行之前。在你的情况下,这没有什么不同。 - (A2) 的初始化适用于
MazeGame
将永远拥有的所有构造函数,而 (A) 方法仅初始化room
在此单个MazeGame()
构造函数中,不影响您将来可能添加的任何构造函数。 - 将初始化移动到
room
字段 "allowed" 您可以从源代码中删除构造函数并 依赖默认构造函数 编译器在没有构造函数的情况下生成。我不认为这是一种好处,而是一种维护风险,因为如果将来你想添加一些,例如MazeGame(Room room)
构造函数,这不仅添加了新的构造函数(预期结果),而且还删除了默认构造函数 - 可能非常出乎意料。