【Java学习笔记】如何定义Java中的不可变类

Java中的不可变类指的是该类的实例创建后,实例中的实例变量是不可改变的。Java提供的8个包装类以及java.lang.String类都是不可变类。

下面的程序试图创建一个不可变类Person,但是由于Person包含一个引用类型的成员变量,且这个引用类是可变类,所以导致Person类也变成了可变类。

public class Name {
  private String firstName;
  private String lastName;
  public Name() {}
  public Name(String firstName,String lastName) {
     this.firstName=firstName;
     this.lastName=lastName;
}
  public String getFirstName() {
     return this.firstName;
  }
  public void setFirstName(String firstName) {
     this.firstName=firstName;
  }
  public String getLastName() {
     return this.lastName;
  }
  public void setLastName(String lastName) {
     this.lastName=lastName;
  }
}

public class Person {
  private final Name name;
  public Person(Name name) {
     this.name=name;
  }
  public Name getName() {
     return this.name;
  }
  public static void main(String[] args) {
     Name n=new Name("悟空","孙");
     Person p=new Person(n);
     System.out.println(p.getName().getFirstName());
     n.setFirstName("八戒");
     System.out.println(p.getName().getFirstName());
  }
}


运行程序,输出:

悟空

八戒


可以看到,main函数中定义Person类的对象p时,使用了Name型引用变量n来初始化它。而后面程序将n的FirstName作了修改,同时,这引起了了Person类实例p内的实例变量发生了改变,于是Person类便也不再是不变类了。


为了保护Person类的不可变性,这就要求我们不能够通过改变Person对象内的引用类型变量n的内容来改变Person对象。只要让程序无法访问到可变的name,这样也就无法使Person对象的内的成员变量发生改变,同时保持了Person类的不变性。

将程序作如下修改:


public class Person {
  private final Name name;
  public Person(Name name) {
     //设置name实例变量为临时创建的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("悟空","孙");
     Person p=new Person(n);
     System.out.println(p.getName().getFirstName());
     n.setFirstName("八戒");
     System.out.println(p.getName().getFirstName());
  }
}


运行程序,输出:

悟空

悟空


可以说明,改变Name型引用变量n内的值没有对Person类对象造成影响,从而保护了Person类的不可变性。

以上就是Java中不可变类定义时要注意的一些小问题,在需要用到可变对象对不可变类的对象进行初始化时,可以选择创建参数与可变对象相同的临时对象对不可变量进行初始化,这样在可变对象内容发生改变时,不会影响到不可变类的对象实例变量的改变。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值