假设我有一个来自班级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...)
}
答案 0 :(得分:4)
我会通过构造函数完成所有事情。这样你就不会忘记这样做并最终得到一个部分构造的对象。使用构造函数可以自然地创建不可变对象,这些对于能够推断其行为(特别是在多线程环境中)非常有用
对此的后续操作是使用builder pattern。在此方案中,您为构建器组件提供参数,然后构建器可以确定缺少的参数和/或如何构造对象。
e.g。
FooBuilder fb = new FooBuilder();
fb.setX(1);
fb.setY(2);
// etc...
Foo f = fb.newInstance();
说完这一切之后,你需要用如此多的参数构造你的对象吗?这听起来像是:
x
和y
坐标作为point
等。)答案 1 :(得分:1)
一般情况下,我会建议您使用第一种方法,以便松散耦合。 您的班级需要初始化的成员数量无关紧要 一旦开始为非平凡的类编写单元测试,就会需要这种方法 你需要嘲笑那些成员。
如果您想了解有关您问题的设计决策的更多信息,请浏览网页以获取有关依赖注入,单元测试,控制反转和松耦合的更多读数。
答案 2 :(得分:0)
就个人而言,我会提到你的第二个版本,即在构造函数中用setX(),setY()等初始化。因为你不会有部分构造的对象,而且它看起来整洁。