在学习不可变类的设计模式时遇到了一个问题想不明白,向大家求助。
class Person{
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
public class TestImmutable {
private final Person person;
public TestImmutable(Person person){
this.person=person;
}
public Person getPerson()
{
return person;
}
public static void main(String[] args)
{
Person st=new Person("zhangsan",20);
TestImmutable ti=new TestImmutable(st);
System.out.println(ti.getPerson().getAge());
st.setAge(21);
System.out.println(ti.getPerson().getAge());
}
}
Final关键字修饰变量表示变量的引用不变,但是对象是可变的。我们通过提供set方法改变对象。若将TestImmutable类改为如下形式则Person类的实例对象将不可改变。
public class TestImmutable {
private final Person person;
public TestImmutable(Person person){
this.person=new Person(person.getName(),person.getAge());//?????
}
public Person getPerson()
{
return new Person(person.getName(),person.getAge());//??????
}
……
……
为什么改为用new创建的对象,就使set方法无法改变属性了呢?在TestImmutable类的构造器中没有直接使用传入的person对象,是用new创建的一个新对象,get方法返回的是一个匿名对象,这样做有什么道理?
|
|