不可变类
2015-04-29 00:00
85 查看
Name类:
Person类:
以上这样的设计破坏了不变类的初衷。因为Person的name属性被改变了。
更改为:
新Person类
新的Person类改写了设置name属性的方法。没有直接利用已有的Name对象,而是重新创建一个Name对象,确保Person对象的name属性不被改变。
PS: 不可变类的实例的状态不可改变,可以很方便地被多个对象所共享。
设计一个不可变类,尤其需要注意引用类型的属性,如果引用类型属性的类是可变的,必须采用必要措施保护该属性所引用的对象不会被改变。
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: 不可变类的实例的状态不可改变,可以很方便地被多个对象所共享。
设计一个不可变类,尤其需要注意引用类型的属性,如果引用类型属性的类是可变的,必须采用必要措施保护该属性所引用的对象不会被改变。
相关文章推荐
- [软件人生]十种老板不可追随
- 不可取代的网站开发工具---------dreamweaver
- 软件工程师不可不知的10个概念
- android 开发中不可不知的技巧
- 让你在职场上不可替代的12信条 30句职场箴言
- checkbox在jquery版本1.9 以上用attr不可重复操作的问题【附解决方案】
- 【初学java】eclipse生成javadoc时出错:编码GBK的不可映射字符
- 理解python可变类型vs不可变类型,深拷贝vs浅拷贝
- 维修小记-不可忽视的bios设置
- 设置select只读不可编辑,值可传递
- Android 对于Sqlite数据库的操作 感觉到不可理解的地方 1
- 数据库的脏读、不可重复读、幻读以及不可重复读和幻读的区别
- 可重入函数与不可重入函数(转)
- 缓存不可变类的实例
- Java的clone机制及其可变类与不可变类
- C#之WinForm基础 新建一个不可编辑的comboBox
- 工程师讲堂:网络维护不可忽视的小环节
- 运营和技术之间不可调和的“矛盾”
- 如何判断K个2的N(N不可重复)次幂为和的整形值X中是否包含2的M次幂
- 编码GBK的不可映射字符