0

可以说我有一个foo来自 class的对象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...)
}
4

3 回答 3

4

我会通过构造函数做所有事情。这样你就不会忘记这样做并最终得到一个部分构造的对象。使用构造函数自然会导致生成不可变对象,这些在能够推理它们的行为方面很有用(尤其是在多线程环境中)

对此的跟进将是使用构建器模式。在这种情况下,您向构建器组件提供参数,然后构建器可以确定缺少的参数和/或如何构造对象。

例如

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

说了这么多,你需要用这么多参数来构造你的对象吗?这听起来像:

  1. 你的对象自己做的太多了,或者
  2. 这些参数可以组合成其他有意义的对象(例如xy坐标point等)
于 2012-12-28T14:03:39.863 回答
1

一般来说,为了松散耦合,我建议您使用第一种方法。您的类需要初始化多少成员并不重要。
一旦您开始为非平凡的类编写单元测试,您将需要这种方法,
您需要在其中模拟这些成员。

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

于 2012-12-28T14:35:35.530 回答
0

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

于 2012-12-28T14:04:58.083 回答