我正在阅读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;
}
我提供了一个默认年龄,但是我的构造函数没有链接,这可以吗?如果没有,我将如何在不可变类中提供两个构造函数?
答案 0 :(得分:5)
用户可以调用第一个构造函数,它根本不会设置personAge
。 final
变量必须由构造函数的末尾明确赋值,并且它不是。
在一个构造函数中切换personfirstname
和personlastname
的赋值,并在另一个构造函数中调用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将没有值。