Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过工厂方法构建Java对象:属性与构造函数(通过方法)_Java_Constructor_Factory - Fatal编程技术网

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

通过工厂方法构建Java对象:属性与构造函数(通过方法),java,constructor,factory,Java,Constructor,Factory,我有一个类(a),它通过工厂方法(2)使用(1)另一个类(B): 例如: (B) public class OrdinaryRoom{ private String name = "ordinaryRoom"; } 我也可以这样写(A): (A)和(A2)有什么区别? 用一个代替另一个有一些好处?我看到的区别是: 初始化

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

例如:

(B)
public class OrdinaryRoom{
  private String name = "ordinaryRoom";
}
我也可以这样写(A):

(A)和(A2)有什么区别? 用一个代替另一个有一些好处?

我看到的区别是:

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

没有区别,只是第一个选项太长了。答案是否定的。它们是相同的,没有真正的区别。请注意,您的工厂不需要受到保护,应该位于room类中,并且应该是静态的,因为它不需要MazeGame实例来返回房间。没有区别。请向所有人说明。对于@davidxxx:我将makeRoom()设置为受保护的,因为我希望只有新的Mazegame()才能做到这一点。因为同样的原因,它不是静态的:只有crerating Mazegame可以“调用”制作房间。(这是错误的吗?)为你的深入分析(也给@lexycore)加油。我还认为(A2)这是一个更好的解决方案,因为:可以在不依赖第一行条件的情况下更改构造函数,还因为最好在构造函数内部声明对象构造的所有操作,以使每个人都可以使用(代码维护)
(B)
public class OrdinaryRoom{
  private String name = "ordinaryRoom";
}
(A2)
public class MazeGame{
  private Room room = makeRoom();  // (1)(2)

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