クライアントはオブジェクトへの参照を保持しているため、現在のオブジェクトとその現在の状態に常にアクセスします。クラスのインスタンスは、古くなったり無効になったりするという意味ではステートフルではありません。
クラスのインスタンスを 1 か所で変更すると、そのインスタンスを参照するすべてのクラスがアクセスできるようになります。
この例は、すべてのクラスがメモリ内の同じ場所を指すState,B,C
のインスタンスを含むため、上記のポイントを示しています。クラスが変更されると、変更の状態は、クラスが参照するメモリ内のインスタンスに対して行われます。A
aka: reference
B
A
State,B,C
C
変更されたと考えないでください。A
これで、 のすべてのインスタンスA
が更新されます。誰もが更新されたオブジェクトを指しているようなものだと考えてください。
これは本当に単純な実際の例です。すべての友達に、私の LinkedIn プロフィールを編集する許可を与えたとしましょう。私の LinkedIn プロフィールを「A」と考えてください。友達全員が私のプロフィール (A) を見ると、私の役職は Web アプリケーション開発者であることがわかります。ここで、友人 (B) の 1 人が私のプロフィールにアクセスし、タイトルを Hobo (フィールド) に変更すると、すべての友人 (A、B、C) に新しいタイトルが表示されます。私の他の友人 (州、C) が私の肩書き (フィールド) として「Web アプリケーション開発者」を見ないのはなぜですか? これは、私のプロファイル (A) のインスタンスが 1 つあり、同じプロファイルがアクセス権を持つすべてのユーザーによって表示または更新されるためです。
public class State {
public static void main(String[] args) {
A a = new A();
B b = new B(a);
C c = new C(a);
System.out.println(a.field); //0
System.out.println(b.a.field); //0
System.out.println(c.a.field); //0
b.change();
System.out.println(a.field); //3
System.out.println(b.a.field); //3
System.out.println(c.a.field); //3
}
}
class A{
public Integer field = 0;
}
class B{
public A a;
public B(A a){
this.a = a;
}
public void change(){
this.a.field = 3;
}
}
class C{
public A a;
public C(A a){
this.a = a;
}
}