47

ステートメントを使用して定義された変数があるとしましょうint someVariable;。コードの実行中に、変数の値が変化します。

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

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

4

5 に答える 5

40

Java は、この種の単純な Observer パターンの実装を提供しますが、リスナー通知を管理するメソッド内で監視変数を設定する必要があります。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);
  }
}
于 2013-03-15T14:00:56.123 に答える
34

これは、 setter/getterペアの背後にある変数を非表示にする多くの理由の 1 つです。次に、セッターで、この変数が適切な方法で変更されたことをリスナーに通知できます。他の人がコメントしているように、あなたが望むことを正確に行うための組み込みの方法はありません。自分で実装する必要があります。

別の方法として、Benjamin は Decorator パターンと呼ばれる興味深いパターンを提示しています。これは、問題のコードを変更できない場合に役立つ可能性があります。ウィキペディアで詳細を調べることができます

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

class MyClass{
    public void doFunc(){...}
}
    
class MyLoggedClass extends MyClass{
    MyClass myObject;
    
    public void doFunc(){
        //Log doFunc Call
        myObject.doFunc();
    }
}

それ以外の

MyClass object = new MyClass();

あなたが使うだろう

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

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

ウィキペディアでわかるように、これは通常、問題のクラスが継承するインターフェイスを介して行われますが、あなたのケースではこれが不可能な場合があります。

于 2013-03-15T13:40:44.347 に答える
3

Observer Patternを実装する必要があると思います。

于 2013-03-15T13:38:42.987 に答える
1

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

于 2013-03-15T13:37:50.257 に答える