【发布时间】:2012-11-13 21:45:33
【问题描述】:
假设我们有这样的情况:
public class Bar1 {
public final int VALUE1;
public final double VALUE2;
public final String NAME;
/*DOZENS OF FINALS!*/
public Bar1(int v1, double v2, String name)
{
this.VALUE1 = v1;
this.VALUE2 = v2;
this.NAME = name;
}
}
和
public class Foo1
{
private Bar1 bar1;
private Bar1 bar2;
private Bar1 bar3;
/*Dozens of bars!*/
public Foo1( //We need to pass the values in here)
{
bar1 = new Bar1( //we need to initialise each of the bars. )
bar2 =...
bar3 = ...
}
}
这样做的好方法是什么?我认为将每一个都作为自己的论点传递,
例如:
public class Foo1
{
private Bar1 bar1;
private Bar1 bar2;
private Bar1 bar3;
/*Dozens of bars!*/
public Foo1(int bar1Value1, double bar1Value2, String bar1String,
int bar2Value1, double bar2Value2, String bar2String,
int bar3Value1, double bar3Value2, String bar3String)
{
bar1 = new Bar1(bar1Value1, bar1Value2, bar1String);
bar2 = new Bar1(bar2Value1, bar2Value2, bar2String);
bar3 = new Bar1(bar3Value1, bar3Value2, bar3String);
}
}
真是让人头疼。
我将发布我提出的解决方案,但我想知道还有哪些其他解决方案。
【问题讨论】:
-
只是不要让它们成为最终的,而是使用构建器。
-
你考虑过建造者模式吗? (Ps 这不是一个测验网站 - 您应该提供所有相关信息)。
-
@Adam:为什么不让它们成为最终版本?构建器对于构建具有最终字段的不可变对象非常有用。
-
@Adam Builder 模式可以与 final 字段共存。
-
@assylias 我认为决赛必须在构造函数完成的时间进行初始化......显然可以通过使对象不可变、私有构造函数等来模拟决赛。
标签: java constructor initialization final