java学习笔记4——不可变类

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 Person
{
  private final Name name;
  public Person(Name name) { 
   this.name = name;
 }
  public Name getName() { 
   return name;
 } 

  public static  void main(String[] args){ 
  Name n =  new Name( "悟空""孙");
  Person p =  new Person(n);
   // Person对象的name的firstName值为"悟空"
  System.out.println(p.getName().getFirstName());
   // 改变Person对象name的firstName值
  n.setFirstName( "八戒");
   // Person对象的name的firstName值被改为"八戒"
  System.out.println(p.getName().getFirstName());
 }
}
       这样就破坏了设计Person类的初衷。为了保持Person对象的不变性,必须保护好Person对象的引用类型成员变量:name,让程序无法访问到Person对象的name成员变量。修改如下:
 //使用提供的setter,getter方法可以保护父类中的成员变量不被修改
//因为n对象肯定是被修改了的,这里就是不用n对象了,另外又创建了一个Name对象
  public Person(Name name){
   this.name =  new Name(name.getFirstName(), name.getLastName()) ;
 }
  public Name getName(){
   return new Name(name.getFirstName(), name.getLastName()) ;
 } 

        当程序向Person构造器传入一个Name对象时,改构造器创建Person对象时并不直接利用已有的Name对象,(利用已有的Name对象有风险,因为这个已有的Name对象可变,如果程序改对象的name成员变量,将会导致Person对象发生变化)而是重新创建一个Name对象来赋给Person对象的name成员变量。当Person对象返回name成员变量时,并没有直接把name成员变量返回,直接繁华name成员变量的值也可能导致它所引用的Name对象被修改。

         这样改,只是防止n对象修改时p对象也被修改了。最大的不同就是形参接收修改后的n对象后,之前的就是用修改后的n来返回给name成员变量,而新的是重新创建了一个新的Name对象,赋给name成员变量,保证了p对象没有受到n对象修改时的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值