java学习笔记4——不可变类
来源:互联网 发布:数据库MySQL5.5 编辑:程序博客网 时间:2024/05/06 18:54
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
- java学习笔记4——不可变类
- java学习笔记15——不可变类
- 【Java学习笔记】如何定义Java中的不可变类
- Java枚举类学习笔记和设置不可变类
- Java并发笔记四——不可变对象
- Java 不可变类
- Java不可变类
- java 不可变类
- Java-不可变类
- 【Java学习笔记】 String变量为什么是不可变的?
- 【Java学习笔记】解惑:string类型变量“不可变”?
- JAVA学习笔记45——四种引用+三种HashMap+同步控制+不可变设置
- 51 Java final——不可变类
- java学习笔记24——String类不可变性
- java的不可变类
- Java中的不可变类
- Java中的不可变类
- JAVA中的不可变类
- Spring单实例、多线程安全、事务解析
- document.documentElement
- 关于ARM的22个常用概念
- 一些算法的MapReduce实现——矩阵相乘一步实现
- 定时开机功能都没有的iPhone热卖,这不科学?
- java学习笔记4——不可变类
- 图的深度优先遍历序列
- string
- NYOJ 101 两点距离
- 图的宽度优先遍历序列
- (03)数据泵expdp/impdp
- UML概述
- 黑马程序员_学习笔记第12天——多线程2
- LayoutInflater作用及使用