使用多个构造函数创建不可变类

时间:2016-02-10 21:28:58

标签: java immutability

我正在阅读this page关于在Java中创建不可变类,并决定修改我正在编写的页面上列出的规范。

final String personfirstname;
final String personlastname;
final int personAge;

public Person(String firstname, String lastname) {

   this.personfirstname = firstname;
   this.personlastname = lastname;
}

public Person(String firstname, String lastname, int personAge){
    this(firstname,lastname);

    this.personAge = personAge;
}

我的问题是,eclipse说personAge可能没有被设置,尽管我在第二个构造函数中这样做。是不是可以在java中创建一个带有两个构造函数的不可变类?如果有可能我该怎么办?

我最近的就是这个:

final private String personfirstname;
final private String personlastname;
final private int personAge;

public Person(String firstname, String lastname) {

    this.personfirstname = firstname;
    this.personlastname = lastname;
    //Set a default age
    this.personAge = 0;

}

public Person(String firstname, String lastname, int age){

    this.personfirstname = firstname;
    this.personlastname = lastname;
    this.personAge=age;
}

我提供了一个默认年龄,但是我的构造函数没有链接,这可以吗?如果没有,我将如何在不可变类中提供两个构造函数?

2 个答案:

答案 0 :(得分:5)

用户可以调用第一个构造函数,它根本不会设置personAgefinal变量必须由构造函数的末尾明确赋值,并且它不是。

在一个构造函数中切换personfirstnamepersonlastname的赋值,并在另一个构造函数中调用this构造函数。这样,第一个构造函数委托第二个构造函数执行所有操作,包括设置年龄。

public Person(String firstname, String lastname) {
    // or another reasonable default value for age
    this(firstname, lastname, 0);  
}

public Person(String firstname, String lastname, int personAge){
    this.personfirstname = firstname;
    this.personlastname = lastname;
    this.personAge = personAge;
}

构造函数保持链接,因此不会复制任何代码。所有字段都一起分配,并且在调用任何构造函数的末尾都明确分配了所有字段。

答案 1 :(得分:0)

您需要在第一个构造函数中调用第二个Person(first,last,age)构造函数,或者需要将this.personAge设置为第一个构造函数中的某个默认值。

截至目前,如果有人使用第一个构造函数声明Person,那么最终的int personAge将没有值。