java学习笔记15——不可变类
2014-01-22 15:20
369 查看
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对象修改时的影响。
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对象修改时的影响。
相关文章推荐
- java学习笔记24——String类不可变性
- Java并发学习笔记(15)信号量(Semaphore) 关卡((2)CyclicBarrier)
- java学习笔记15--引用传递
- (15)Java学习笔记——面向对象08——异常
- 黑马程序员_JAVA 学习笔记28 WEB篇15
- 毕向东的Java学习笔记Day 15
- java个人学习笔记15(package+import+jar)
- 从java到安卓学习笔记--到15-06-16
- 毕向东Java视频学习笔记【Day15 字符串+StringBuffer+StringBuilder类基础】
- 【学习笔记15】java面向对象-匿名内部类
- Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
- Effective Java学习笔记 4 通过私有构造器增强不可实例化的能力
- 学习笔记15—Java高新技术3
- java 设计模式 学习笔记(15) 组合模式
- java学习笔记15--引用传递
- Java学习笔记18天---(15)
- 【Java学习笔记】基础知识学习15【文本输入】
- 【DAY15】Java第十五天I/O学习笔记
- Java 学习笔记15:关于web开发中,全局变量的一点想法
- Thinking in java学习笔记之String的不可变性