Immutable——想破坏它也没办法

it2022-05-05  66

Immutable Pattern是指那些有着能够保证实例状态绝不会改变的类(immutable类),在访问这样的实例中,可以省去使用共享机制所会浪费的时间。如果能妥善使用可以提高程序性能。 思考成对的mutable类与immutable类【执行性能】

 

setter还是有被用到,可能是在:1.getter方法里面判断,然后可能会改变值2.构造方法里面可能会改变值。   也许可以将这个类二分为mutable类和immutable类,再设计成可由mutable类的实例构造出immutable类的实例,并也可以从immutable类的实例构造出mutable类的实例。

public class StringBufferTest { public static void main(String[] args) { // String -- StringBuffer String s = "hello"; // StringBuffer sb = "hello"; //错误的,注意:不能把字符串的值直接赋值给StringBuffe // StringBuffer sb = s; //错误的 // 方式1:通过构造方法 StringBuffer sb = new StringBuffer(s); System.out.println("sb:" + sb); //sb:hello // 方式2:通过append()方法 StringBuffer sb2 = new StringBuffer(); sb2.append(s); System.out.println("sb2:" + sb2); //sb2:hello //--------------------------------------------------- // StringBuffer -- String StringBuffer buffer = new StringBuffer("java"); // String(StringBuffer buffer) // 方式1:通过构造方法 String str = new String(buffer); System.out.println("str:" + str); //str:java // 方式2:通过toString()方法 String str2 = buffer.toString(); System.out.println("str2:" + str2);//str2:java } }

  要由多个字符串建立出新的字符串,用StringBuffer会比String快很多。

 

 

练习: 练习1:

 

解答:即使没有setter方法,可以不操作该对象改变对象的属性值,直接操作该属性的内存空间里的值,只要指针不变,对象的属性值就变了。

练习2:

 

 

 

 

解答:

 

练习3:

public final class MutablePerson { private String name; private String address; public MutablePerson(String name, String address) { this.name = name; this.address = address; } public MutablePerson(ImutablePerson person) { this.name = person.getName(); this.address = person.getAddress(); } public synchronized void setPerson(String newName,String newAddress){ name = newName; address = newAddress; } public synchronized ImutablePerson getImutablePerson(){ return new ImutablePerson(this); } String getName() { return name; } String getAddress() { return address; } @Override public String toString() { return "MutablePerson{" + "name='" + name + '\'' + ", address='" + address + '\'' + '}'; } }

  

package entity; public final class ImutablePerson { private final String name; private final String address; public ImutablePerson(String name, String address) { this.name = name; this.address = address; } public ImutablePerson(MutablePerson mutablePerson) { this.name = mutablePerson.getName(); this.address=mutablePerson.getAddress(); } public MutablePerson getMutablePerson(){ return new MutablePerson(this); } public String getName() { return name; } public String getAddress() { return address; } @Override public String toString() { return "ImutablePerson{" + "name='" + name + '\'' + ", address='" + address + '\'' + '}'; } }

  

测试逻辑: MutablePerson mutable = new MutablePerson(“start”,“start"); 给CrackerThread的MutablePerson赋值 run方法:(循环){1.创建ImmutablePerson,参数为mutable2.如果immutable的name和address不对应就抛出异常                                     } 创建三个CracherThread并启动 用无限循环调用mutable的setPerson方法。

 

相当于读写冲突吧。

 

转载于:https://www.cnblogs.com/wzdnwyyu/p/11156442.html


最新回复(0)