A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涂金哲 中级黑马   /  2012-6-28 16:55  /  1095 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习不可变类的设计模式时遇到了一个问题想不明白,向大家求助。
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方法返回的是一个匿名对象,这样做有什么道理?

点评

你这样写,所有基于get方法得到person对象都是一个拷贝,所以你改变其属性并不会导致内部的person改变  发表于 2012-6-28 17:08

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马