论坛首页 Java企业应用论坛

初学者 关于不可变类的疑惑

浏览 2167 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-03-11  
//不可变类Person类  但因为Person类包含一个引用类型Field,且这个引用类是
//可变类,所以导致Person类也变成了可变类
class Name
{
private String firstName;
private String lastName;
public Name(){}
public Name(String firstName,String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getFirstName()
{
return this.firstName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public String getLastName()
{
return this.lastName;
}
}
/*public class Person0001
{
private final Name name;
public Person0001(Name name)
{
this.name = name;
}
public Name getName()
{
return name;
}
public static void main(String[] args)
{
Name n = new Name("悟空","孙");
Person0001 p = new Person0001(n);
//Person对象的name的firstName值为“悟空”
System.out.println(p.getName().getFirstName());
//改变Person对象的name的first值
n.setFirstName("八戒");
//Person对象的name的firstName值被改为"八戒"
System.out.println(p.getName().getFirstName());


}
不难发现Person对象的name的firstName已经改变了,这就破坏了设计Person类的初衷
为了保持Person对象的不可变性,必须保护好Person对象的引用类型Field:name,让程序无法访问到Person对象的
name Field的可变性来改变Person对象了

}*/
public class Person0001
{
private final Name name;
public Person0001 (Name name)
{
//设置name Field为临时创建的Name对象,该对象firstName和lastName
//与传入的name对象的firstName和lastName相同
this.name = new Name(name.getFirstName(),name.getLastName());
}
public Name getName()
{
//返回一个匿名对象,该对象的firstName和lastName
//与该对象里的name的firstName和lastName相同
return new Name(name.getFirstName(),name.getLastName());
}
public static void main(String[] args)
{
Name n = new Name("悟空","孙");
Person0001 p = new Person0001(n);
//Person对象的name的firstName值为“悟空”
System.out.println(p.getName().getFirstName());
//改变Person对象的name的first值
n.setFirstName("八戒");
//Person对象的name的firstName值被改为"八戒"
System.out.println(p.getName().getFirstName());
}
}


能否帮忙 分析 一下 上面的代码
   发表时间:2014-03-13  
你的问题是什么?或者说你有什么疑惑?
0 请登录后投票
   发表时间:2014-03-13  
对Name使用final指的是引用不变,不代表引用的内容不变
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics