Java初始化对象设计

时间:2012-12-28 14:01:43

标签: java

假设我有一个来自班级foo的对象Foo。让我们说类Foo有很多字段来描述它的后代。

当拥有这么多字段时,是否最好通过Foo的构造函数初始化它们,例如。

Foo foo = new Foo(0, 12, 123, 2, 2, (and so on...));

或在第一类的构造函数或方法中初始化它们将使用foo例如。

Foo foo = new Foo();

public void initFoo() {
    foo.setX(1);
    foo.setY(3);
    foo.setH(3);
    (and so on...)
}

3 个答案:

答案 0 :(得分:4)

我会通过构造函数完成所有事情。这样你就不会忘记这样做并最终得到一个部分构造的对象。使用构造函数可以自然地创建不可变对象,这些对于能够推断其行为(特别是在多线程环境中)非常有用

对此的后续操作是使用builder pattern。在此方案中,您为构建器组件提供参数,然后构建器可以确定缺少的参数和/或如何构造对象。

e.g。

FooBuilder fb = new FooBuilder();
fb.setX(1);
fb.setY(2);
// etc...
Foo f = fb.newInstance();

说完这一切之后,你需要用如此多的参数构造你的对象吗?这听起来像是:

  1. 你的对象自己做得太多了,或者
  2. 这些参数可以组合成其他有意义的对象(例如xy坐标作为point等。)

答案 1 :(得分:1)

一般情况下,我会建议您使用第一种方法,以便松散耦合。 您的班级需要初始化的成员数量无关紧要 一旦开始为非平凡的类编写单元测试,就会需要这种方法 你需要嘲笑那些成员。

如果您想了解有关您问题的设计决策的更多信息,请浏览网页以获取有关依赖注入,单元测试,控制反转和松耦合的更多读数。

答案 2 :(得分:0)

就个人而言,我会提到你的第二个版本,即在构造函数中用setX(),setY()等初始化。因为你不会有部分构造的对象,而且它看起来整洁。