文档章节

不可变类

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:44
字数 329
阅读 2
收藏 0

Name类:

public class Name{
	public String FirstName;
	public String LastName;
	
	public Name(){
	
	}
	
	public Name(String first,String last){
		this.FirstName = first;
		this.LastName =last;
	}
	
	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;
	}
}


Person类:

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("李");//Person对象的Name属性firstname已经改变
		
		System.out.println(p.GetName().GetFirstName());
		
	}
}

以上这样的设计破坏了不变类的初衷。因为Person的name属性被改变了。


更改为:

新Person类

public class Person{
	private final Name name;
	
	public Person(Name name){ this.name=new Name(name.GetFirstName(),name.GetLastName()); } public Name GetName(){ 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());
		
	}
}

新的Person类改写了设置name属性的方法。没有直接利用已有的Name对象,而是重新创建一个Name对象,确保Person对象的name属性不被改变。




PS:  不可变类的实例的状态不可改变,可以很方便地被多个对象所共享。

设计一个不可变类,尤其需要注意引用类型的属性,如果引用类型属性的类是可变的,必须采用必要措施保护该属性所引用的对象不会被改变。




本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/8227250

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Java 可变对象和不可变对象

一、简单定义 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immuta...

JackieYeah
2014/03/04
3.9K
0
java中Final关键字和Immutable Class以及Guava的不可变对象

大纲 写这篇文章的起因 java中Final关键字 如何构建不可变对象 Guava中不可变对象和Collections工具类的unmodifiableSet/List/Map/etc的区别 实验代码 写这篇文章的起因 java项目在使用FindB...

敲代码猥琐男
2015/09/23
3.4K
0
java(二十三) 可变类和不可变类

概念: 可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容。 不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。不可变类的实例一但创建,其内在成员...

胡脸脸
2016/03/05
101
0
Effective Java 第三版——17. 最小化可变性

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104
2018/01/08
0
0
Effective-java 3 中文翻译系列 (Item 17)

看了Effective-java2的中文翻译版之后,发现比较难理解,而且有很多内容也已经过时,后来找到有第3版的原文版和一些热心人士的中文翻译,发现翻译还是感觉不太好理解,就打算自己翻译一下。而...

薛银亮
2018/06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部