模式2-Immutable
来至《java多线程设计模式》
一、方法:无需synchronized方法,本身就不变,没有提供可以让外界修改的方法,只有读取。
public final class Person { private final String name; private final String address; public Person(String name, String address) { this.name = name; this.address = address; } public String getName() { return name; } public String getAddress() { return address; } public String toString() { return "[ Person: name = " + name + ", address = " + address + " ]"; } }
二、不容易发现的错误:
public final class UserInfo { private final StringBuffer info; public UserInfo(String name, String address) { this.info = new StringBuffer("<info name=\"" + name + "\" address=\"" + address + "\" />"); } public StringBuffer getInfo() { return info; } public String toString() { return "[ UserInfo: " + info + " ]"; } }
public class Main { public static void main(String[] args) { // 制作实体 UserInfo userinfo = new UserInfo("Alice", "Alaska"); // 显示 System.out.println("userinfo = " + userinfo); // 状态变更 StringBuffer info = userinfo.getInfo(); info.replace(12, 17, "Bobby"); // "Alice"竚琌12..16 //再度显示 System.out.println("userinfo = " + userinfo); } }
结果:
userinfo = [ UserInfo: <info name="Alice" address="Alaska" /> ] userinfo = [ UserInfo: <info name="Bobby" address="Alaska" /> ]
public final class ImmutablePerson { private final String name; private final String address; public ImmutablePerson(String name, String address) { this.name = name; this.address = address; } public ImmutablePerson(MutablePerson person) { this.name = person.getName(); this.address = person.getAddress(); } public MutablePerson getMutablePerson() { return new MutablePerson(this); } public String getName() { return name; } public String getAddress() { return address; } public String toString() { return "[ ImmutablePerson: " + name + ", " + address + " ]"; } }
public synchronized void setPerson(String newName, String newAddress) { name = newName; address = newAddress; }
执行ImmutablePerson(MutablePerson person)时,person的name,address可能不匹配。
浙公网安备 33010602011771号