您的位置:首页 > 编程语言 > Java开发

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

2017-11-01 23:35 267 查看
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中不可变类定义时要注意的一些小问题,在需要用到可变对象对不可变类的对象进行初始化时,可以选择创建参数与可变对象相同的临时对象对不可变量进行初始化,这样在可变对象内容发生改变时,不会影响到不可变类的对象实例变量的改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java class