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

不可变类

2015-04-29 00:00 85 查看
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: 不可变类的实例的状态不可改变,可以很方便地被多个对象所共享。

设计一个不可变类,尤其需要注意引用类型的属性,如果引用类型属性的类是可变的,必须采用必要措施保护该属性所引用的对象不会被改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Class JAVA 不可变类