Java Immutable可変クラス
1720 ワード
不変クラス
Java可変クラスとは、このクラス変数が初期化されると変更できないクラスを指す.
可変クラスの利点:スレッドセキュリティ(可変ではないため) より効率が高い(マルチスレッドはロックを必要としない) は、エラーを心配することなく繰り返し使用することができる.例えば、その静的変数は、インスタンスのhash値を格納する.
Immutalbeクラスの使用上の注意
可変は柔軟性を失うことを意味し、可変クラスインスタンスを大量に使用すると、変数が多重化されないとメモリが漏洩します.
Immutableクラスの作成原則クラスはfinalオブジェクトに設定され、継承されないようにします.Aクラスは可変クラスではなくfinalではなく、BクラスはAクラスを継承すると仮定します.では、A a=new B()であり、クライアント・プログラマーがAを可変クラスと判断すると、大きな誤解を招きます. すべてのメンバー変数がfinalオブジェクトに設定されます. メンバー関数がメンバー変数の参照を返すことを回避します.外部プログラムは、このようにして参照が指す値を変更します. 変数を返すときはできるだけ変数のコピーを返します.
以下は単純な可変クラスですが、userを返すときはUser自体ではなくコピーを返さなければならないことに注意してください.
Java可変クラスとは、このクラス変数が初期化されると変更できないクラスを指す.
可変クラスの利点:
Immutalbeクラスの使用上の注意
可変は柔軟性を失うことを意味し、可変クラスインスタンスを大量に使用すると、変数が多重化されないとメモリが漏洩します.
Immutableクラスの作成原則
以下は単純な可変クラスですが、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);
}
}