Java Immutable可変クラス

1720 ワード

不変クラス
Java可変クラスとは、このクラス変数が初期化されると変更できないクラスを指す.
可変クラスの利点:
  • スレッドセキュリティ(可変ではないため)
  • より効率が高い(マルチスレッドはロックを必要としない)
  • は、エラーを心配することなく繰り返し使用することができる.例えば、その静的変数は、インスタンスのhash値を格納する.

  • Immutalbeクラスの使用上の注意
    可変は柔軟性を失うことを意味し、可変クラスインスタンスを大量に使用すると、変数が多重化されないとメモリが漏洩します.
    Immutableクラスの作成原則
  • クラスはfinalオブジェクトに設定され、継承されないようにします.Aクラスは可変クラスではなくfinalではなく、BクラスはAクラスを継承すると仮定します.では、A a=new B()であり、クライアント・プログラマーがAを可変クラスと判断すると、大きな誤解を招きます.
  • すべてのメンバー変数がfinalオブジェクトに設定されます.
  • メンバー関数がメンバー変数の参照を返すことを回避します.外部プログラムは、このようにして参照が指す値を変更します.
  • 変数を返すときはできるだけ変数のコピーを返します.

  • 以下は単純な可変クラスですが、userを返すときはUser自体ではなくコピーを返さなければならないことに注意してください.
    public final class MainClass
    {
    	private final String document ;
    	private final User user;
    	public MainClass(String doc,int age,String name)
    	{
    		document = doc;
    		user = new User(age,name);
    	}
    	//     clone    
    	public User getUser()
    	{
    		//return user;
    		return (User)(this.user.clone());
    	}
    	
    	public void printUser()
    	{
    		System.out.println(this.document+":"+this.user.getName());
    	}
    	public static void main(String args[])
    	{
    		MainClass inst = new MainClass("a good guy",19,"allen");
    		inst.printUser();
    		User u = inst.getUser();
    		u.setName("jack");
    		inst.printUser();
    	}
    }
    
    class User implements Cloneable
    {
    	private int age;
    	private String name;
    	public User(int age,String name)
    	{
    		this.age= age;
    		this.name =name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public User clone()
    	{
    		return new User(this.age,this.name);
    	}
    	
    }