Java 对象实例化后初始化的最终属性

Java 对象实例化后初始化的最终属性,java,Java,嗯,我有一个最终属性,但我不想在创建对象时初始化它,因为我不能。因此,我尝试不在构造函数中初始化它,但使用setter,我猜它会像一个只有一次可用的setter,但我有以下错误: java:27:错误:无法为最终变量foo赋值 this.foo = new String(foo); 下面是我用来测试这一点的简短代码: class Test { private final String foo; public static void main(String[] arg

嗯,我有一个最终属性,但我不想在创建对象时初始化它,因为我不能。因此,我尝试不在构造函数中初始化它,但使用setter,我猜它会像一个只有一次可用的setter,但我有以下错误:

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;
    }

}
因此,我假设构造函数隐式生成如下内容。foo=new String();或者this.foo=null;我想我不能改变这种行为,但我怎么能有一个与我想做的事情等价的行为呢?我的想法是:

private String foo;

/* ... */

public void setFoo(String foo) {
    if( !(this.foo.isInitialized()) )
        this.foo = foo;
}
但是Object.isInitialized()方法显然不存在,我找不到等效的x)

我的问题是:我该怎么做?我想要一个在对象实例化时未初始化的最终属性


谢谢

您可以添加一个布尔字段
isInisialized
,但最好的选择是在构造函数中传递值(如果需要,可能使用生成器模式)

您可以添加一个布尔字段
isInisialized
,但最好的选择是在构造函数中传递值(如果需要,可能使用生成器模式)

我的问题是:我该怎么做?我想要一个在对象实例化时未初始化的最终属性

你不能这么做。你所能做的就是有一个单独的字段,一旦你设置了“真实”字段,你也会更新它来记录——如果你试图第二次设置它,就会抛出一个异常

或者,使您的类型不可变,但给它一个方法,该方法构造类的一个新实例,除单个新值外,其他数据与以前相同,例如

public Test withFoo(String newFoo) {
    // Call a private constructor here, passing in the other fields from
    // "this", and newFoo for the value of foo
}
我的问题是:我该怎么做?我想要一个在对象实例化时未初始化的最终属性

你不能这么做。你所能做的就是有一个单独的字段,一旦你设置了“真实”字段,你也会更新它来记录——如果你试图第二次设置它,就会抛出一个异常

或者,使您的类型不可变,但给它一个方法,该方法构造类的一个新实例,除单个新值外,其他数据与以前相同,例如

public Test withFoo(String newFoo) {
    // Call a private constructor here, passing in the other fields from
    // "this", and newFoo for the value of foo
}

规则说最终实例成员变量应该在声明它的地方或构造函数中初始化。根据这条规则,您的需求不能用您的代码来满足。您可以使用生成器模式来实现它。请参见此链接。

规则规定应在声明最终实例成员变量的位置或构造函数中初始化该变量。根据这条规则,您的需求不能用您的代码来满足。您可以使用生成器模式来实现它。查看此链接

好吧,我将简单地使用布尔值的解,谢谢!我不知道建设者的模式。我想我理解它是如何工作的,但我更喜欢第一种解决方案,它将实现得更快,更容易用于单个属性:pWell我将简单地使用布尔值的解决方案,谢谢!我不知道建设者的模式。我想我理解它是如何工作的,但我更喜欢第一种解决方案,它可以更快地实现,并且更容易用于单个属性:p该方法可以多次调用,因此,如果我没有调用,那么我的属性就不是final,这是完全一样的misunderstood@Thiht:该方法将返回一个新对象。。。该字段将在构造函数中设置,因此它可能是最终的。哦,好的,我明白了。好的,谢谢你的回答,在这种情况下它也应该起作用。这个方法可以被调用多次,所以如果我没有调用,那么我的属性就不是final,这是完全一样的misunderstood@Thiht:该方法将返回一个新对象。。。该字段将在构造函数中设置,因此它可能是最终的。哦,好的,我明白了。好的,谢谢你的回答,在这种情况下也应该有效。