2016-05-17 14 views
-1

クラスAで変更できる変数を作成する方法はありますか?これらの変更は別のクラスBで何が起こるかに影響します。このようなJavaの非静的グローバル変数

何か:

class A{ 
public int var = 0; 

} 

と使用このような変数varの値:

class B{ 
if(var == 0) 
    { 
    System.out.println("right now, var is equal 0"); 
    } 
else if(var == 1) 
    { 
    System.out.println("right now, var is equal 1"); 
    } 
} 

また、あなたが見ることができるように私はそれが価値だ変更する必要があるため、varは静的にできませんアプリの実行中に

+0

'B'が' A'の(共有?)インスタンスへの参照を持っていなければ、それはできません。しかし、なぜグローバル変数にstaticを使用しないのですか?もちろん、なぜ "グローバル変数を使っているのですか?" – shmosel

+3

実行時に 'static'変数の値を変更できないものは何もありません。 – Thilo

+3

他のオブジェクトの変更を通知するために、オブザーバーのデザインパターンをルックアップする必要があります。 –

答えて

1

クラスAのクラスBを参照することで、AがBを必要に応じて変更できるようにすることができます。例:

public class A { 

    private int var; 
    private B b; 

    public A(B b) { 
     this.var = 0; 
     this.b = b; 
    } 

    public void set(final int var) { 
     this.var = var; 
     b.set(var); 
    } 

} 

public class B { 

    private int var = 0; 

    public void set(final int var) { 
     this.var = var; 
    } 

} 
+0

@ SamTebbs33あなたは私の 'System.out.println()'を使用してもらえますか?私の質問によると。 –

1

オブザーバー観察パターンを使用できます。

public class A extends Observable { 

    private int var = 0; 

    public void setVar(int val) { 
     this.var = val; 
     notifyObservers(); 
    } 

} 

public class B implements Observer { 

    public void init(A a) { 
     a.addObserver(this); 
    } 

    @Override 
    public void onUpdate(Observable obs, Object arg) { 
     // Do something when A is updated 
     if(var == 0) System.out.println("right now, var is equal 0"); 
     else if(var == 1) System.out.println("right now, var is equal 1"); 
    } 

} 

それが動作する方法はAが他のクラスは何かがAに変化したとき(他のクラスはnotifyObservers()を呼び出しAで通知されます)を更新することができることを意味し、Observableなることです。次に、オブザーバ内のonUpdate()メソッドが、Observable(ここではA)を第1引数として呼び出されます。 Object引数を指定してnotifyObservers()を呼び出すと、のObject引数にその値が使用されます。

A:ここで

は、制御フローであるSETVARは - > A:notifyObservers - > B:にonUpdate

+1

今私が話していることです。 1 + –

+0

@ SamTebbs33あなたのソリューションに感謝します。この問題を実装する方法はありますか?私の2クラスのクラスを拡張しています。 –

+0

@ P.Barbraまあ、ここでは実装の例を挙げました。あなたのニーズに合わせて実装する必要があります。編集:あなたの質問のコードを 'Bの' onUpdate()に追加しました。 – SamTebbs33

0

他の答えによって提案されたObserverパターンは、OPがドン」と思われることを考えると、実際にクリーンなアプローチであるが、トンでも(オブジェクトインスタンスがあるなど何)OOPなどのJavaの基本的な概念上の適切な理解を持って、私は彼が探しているものと考えていることは、他のオブジェクトへの参照であっても、より基本的な何か、である:

class A { 
    private int value = 0; 

    // getters and setters 
} 

class B { 
    private A a; 

    // using constructor to have object reference populated 
    // is only ONE OF THE WAYS 
    public B(A a) { 
     this.a = a; 
    } 

    public void foo() { 
     System.out.println("my referred A value " + this.a.getValue(); 
    } 
} 

もちろん、適切にconstrする必要がありますそれらを修正する。

A a = new A(); 
B b = new B(a); 
b.foo(); 
a.setValue(100); 
b.foo(); 
関連する問題