Immutable——想破坏它也没办法
Immutable Pattern是指那些有着能够保证实例状态绝不会改变的类(immutable类),在访问这样的实例中,可以省去使用共享机制所会浪费的时间。如果能妥善使用可以提高程序性能。
思考成对的mutable类与immutable类【执行性能】
setter还是有被用到,可能是在:1.getter方法里面判断,然后可能会改变值2.构造方法里面可能会改变值。
也许可以将这个类二分为mutable类和immutable类,再设计成可由mutable类的实例构造出immutable类的实例,并也可以从immutable类的实例构造出mutable类的实例。
![](https://img2018.cnblogs.com/blog/1711104/201907/1711104-20190709115343324-89985212.png)
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方法。
相当于读写冲突吧。