go4it

just do it

模式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可能不匹配。

posted on 2009-05-07 10:21  cxccbv  阅读(228)  评论(0)    收藏  举报

导航