好吧,我有一个最后的属性,但我不想在创建对象时初始化它,因为我不能。所以我试着不在我的构造函数中初始化它,但是使用了一个setter,我猜想它本来就像一个只有一次性的可用setter,但我有这个错误:
Test.java:27:错误:无法为最终变量foo
赋值this.foo = new String(foo);
这是我用来测试这个的简短代码:
class Test {
private final String foo;
public static void main(String[] args) {
Test test = new Test();
test.setFoo("gygygy");
System.out.println(test.getFoo());
}
public Test() {
System.out.println("Constructor");
}
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
所以我假设构造函数隐式地生成类似this.foo = new String();或this.foo = null;而且我认为我不能修改这种行为,但我怎么能拥有与我想做的相同的东西呢?我想像是这样:
private String foo;
/* ... */
public void setFoo(String foo) {
if( !(this.foo.isInitialized()) )
this.foo = foo;
}
但是Object.isInitialized()方法显然不存在,我找不到等效的x)
所以这是我的问题,用几句话说:我该怎么办?我想要一个最终属性,在对象实例化时没有初始化。
谢谢!
答案 0 :(得分:2)
你可以添加一个布尔字段isInisialized
,但最好的选择是传递构造函数中的值(如果需要,可能使用Builder模式)
答案 1 :(得分:1)
所以这是我的问题,用几句话说:我该怎么办?我想要一个在对象实例化时没有初始化的final属性。
你根本做不到。所有你能做的就是有一个单独的字段,一旦你设置了“真实”字段,你也更新以备注 - 如果你试图再次设置它,则抛出异常。
或者,让你的类型不可变,但给它一个构造类的 new 实例的方法,使用与之前相同的数据,除了单个新值,例如
public Test withFoo(String newFoo) {
// Call a private constructor here, passing in the other fields from
// "this", and newFoo for the value of foo
}
答案 2 :(得分:0)
规则说最终实例成员变量应该在声明它的位置或在构造函数中初始化。按照这个规则,您的要求不能满足您的要求。您可以使用构建器模式来实现它。请参阅此链接Builder Pattern in Effective Java