如何创建只能设置一次但在Java中不是最终变量的变量


问题内容

我想要一个可以创建一个实例的类,该实例的一个变量未设置(id),然后初始化该变量,并 在初始化后 使其 不可变
。实际上,我想要一个final可以在构造函数之外初始化的变量。

目前,我正在用抛出Exception以下内容的setter来即兴创作:

public class Example {

    private long id = 0;

    // Constructors and other variables and methods deleted for clarity

    public long getId() {
        return id;
    }

    public void setId(long id) throws Exception {
        if ( this.id == 0 ) {
            this.id = id;
        } else {
            throw new Exception("Can't change id once set");
        }
    }
}

这是我尝试做的一种好方法吗?我觉得我应该可以在初始化之后将其设置为不可变的,或者可以使用某种模式使它变得更加优雅。


问题答案:

让我建议您一点更优雅的决定。第一个变体(不引发异常):

public class Example {

    private Long id;

    // Constructors and other variables and methods deleted for clarity

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = this.id == null ? id : this.id;
    }

}

第二种变体(引发异常):

     public void setId(long id)  {
         this.id = this.id == null ? id : throw_();
     }

     public int throw_() {
         throw new RuntimeException("id is already set");
     }