创建正真的Java不可变类

如果需要设计一个不可变类,尤其要注意其引用类型Field,如果其引用类型Field的类是可变的,,就必须采取必要的措施来保护该Field所引用的对象不会被修改,这样才能创建真正的不可变类。

1 class Name { 2private String firstName; 3private String lastName; Name() { 6 } Name(String firstName, String lastName) { 9this.firstName = firstName; 10this.lastName = lastName; 11 } setFirstName(String firstName) { 14this.firstName = firstName; 15 } String getFirstName() {.firstName; 19 } setLastName(String lastName) { 22this.lastName = lastName; 23 } String getLastName() {.lastName; 27 } String toString() {getClass().getName() + “@[firstName=” + this.getFirstName() + “, lastName=” + this.getLastName() + “]”; 32 } 33 } Person1 { Name name; Person1(Name name) { 40this.name = name; 41 } Name getName() {.name; 45 } String toString() {getClass().getName() + “@[name=” + this.getName() + “]”; 50 } 51 } Person { Name name; Person(Name name) { 57// 设置name为临时创建的Name对象,该对象的firstName和lastName与.name = new Name(name.getFirstName(), name.getLastName()); 60 } Name getName() { 63// 返回一个匿名对象,该对象的firstName和lastName与 Name(name.getFirstName(), name.getLastName()); 66 } String toString() {getClass().getName() + “@[name=” + this.getName() + “]”; 71 } 72 } PersonNameImmutableTest { main(String[] args) { 76Name n1 = new Name(“悟空”, “孙”); 77Person1 p1 = new Person1(n1);System.out.println(p1.getName().getFirstName());n1.setFirstName(“八戒”);System.out.println(p1.getName().getFirstName()); 84// 上面的运行结果说明,Person对象的name的firstName值已经被改变了, 85// 这就破坏了设计Person类的初衷为了保持Person1对象的不可变性,必须保护好Person1对象的引用类型Field:name, 88//让程序无法访问到Person1对象的name Field,也就无法利用name Field的可变性来改变 89//Person1对象了。Name n = new Name(“悟空”, “孙”); 92Person p = new Person(n);System.out.println(p.getName().getFirstName());n.setFirstName(“八戒”); 97// 这样,无论如何修改name的值,Person对象的name值不会改变,System.out.println(p.getName().getFirstName());100 }101 }筑起梦想的鸟巢,开始人生的长跑,领先每回的冲刺,

创建正真的Java不可变类

相关文章:

你感兴趣的文章:

标签云: