2013-03-15 22 views
30

たとえば、文を使用して変数を定義しているとします。コードが実行されている間、変数の値が変更されます。変数の変更リスナーを作成する方法は?

この変数の変更をどのように追跡できますか?どのようにonSomeVariableChangedListenerのように動作するリスナーを実装できますか?

また、別のクラスのリスナーを設定できるように、あるページの他のメソッドが実行されたことを知る必要があります。

+0

あなたは、デバッグの目的のためにこれを行うに興味がありますか、生産コードでこれを使用しますか? –

+0

プロダクションコード – Sinigami

答えて

26

を関連付けます。次に、セッターで、この変数が適切な方法で変更されたことをリスナーに通知できます。他の人がコメントしたように、あなたが望むものを正確に行う方法はありません。自分で実装する必要があります。

また、BenjaminはDecoratorパターンと呼ばれる興味深いパターンを表示します。このパターンは、問題のコードを変更できない場合に役立ちます。 You can look up more info at wikipedia

考えられるのは、オブジェクトの周りに互換性のあるラッパーを構築することです。問題のオブジェクトがMyClass型であるとします。

class MyClass{ 
    publc void doFunc(){...} 
} 

class MyLoggedClass extends MyClass{ 
    MyClass myObject; 

    publc void doFunc(){ 
     //Log doFunc Call 

     myObject.doFunc(); 

    } 
} 

代わりの

MyClass object = new MyClass(); 

あなたは、コードのあなたの残りの部分は、各関数呼び出しをログに記録、または通知されることを除いて、通常通りのオブジェクトを使用することになり今

MyClass object = new MyLoggedClass(new MyClass()); 

を使用しますなど。

ウィキペディアのように、これは通常、クラスあなたのケースでは可能ではないかもしれません。

+1

デコレータのコンセプトについて言えば、この問題を解決する方法かもしれませんが、基本的な例が好ましいでしょう。最後の行に –

+0

を追加しましたが、 '... myLoggedClass ...'の代わりに 'MyClass object = new MyLoggedObject ...'を意味しましたか?もしそうなら、あなたは更新してもらえますか?それが正しいとすれば、説明していただけますか?ありがとう。 – dbconfession

+0

@dbconfession良い目、クラスの名前を変更して、別の方法で修正しようとしています –

1

任意の変数の値が変更された場合、または何らかのメソッドが呼び出された場合に通知を受け取る組み込みの方法はありません。

3

How to Write a Property Change Listenerあなたはそれが何かある 役立つかもしれない。これは、セッター/ゲッターペアの後ろに変数を非表示にするには、多くの理由の一つである

+0

私は、彼が変数と_not_プロパティの変更を聞きたいと言うことができると言うことができます。 –

+0

@BenjaminGruenbaum、私の知識によると、beanやクラスの 'variables'は' property'と呼ばれます。 '.property'ファイルについてです。 – Patriks

33

Javaは、この種のオブザーバーパターンの実装を提供しますが、リスナー通知を管理するメソッド内では、観測変数を設定する必要があります。 Observableを拡張できない場合は、コンポジションを使用して(つまり、クラス内のObservableインスタンスを使用して通知を管理する)、またはjava.util.Observableを見て自分自身をロールバックする方法を知ることができますバージョン。

Flux.java

import java.util.Observable; 

public class Flux extends Observable { 
    private int someVariable = 0; 

    public void setSomeVariable(int someVariable) { 
    synchronized (this) { 
     this.someVariable = someVariable; 
    } 
    setChanged(); 
    notifyObservers(); 
    } 

    public synchronized int getSomeVariable() { 
    return someVariable; 
    } 
} 

Heraclitus.java

import java.util.Observable; 
import java.util.Observer; 

public class Heraclitus implements Observer { 
    public void observe(Observable o) { 
    o.addObserver(this); 
    } 

    @Override 
    public void update(Observable o, Object arg) { 
    int someVariable = ((Flux) o).getSomeVariable(); 
    System.out.println("All is flux! Some variable is now " + someVariable); 
    } 
} 
+0

これはリフレクションで失敗しますか?私は変更リスナーの同様の要件があります。しかし、可変値はドーザーによって設定されており、それは反射を介して機能します。 – Vikash

関連する問題