1

メソッドに渡されたオブジェクトのプロパティを使用しようとしていますが、notifyObserversそれらにアクセスする方法が見つからないようです。渡すことができる文字列は 1 つだけですが、オブザーバーにさらに多くのオプションを渡したいと考えています。

これはセットアップのサンプルです。

public class UpdateInfo {

          public String data;
          public int debug = 0;
}

public class RXTXComms extends Observable {

         UpdateInfo info = new UpdateInfo();

         public void sendToBoard(String s) {
                .......

                UpdateInfo.data = "test";
                UpdateInfo.debug = 1;
                stChanged();
                notifyObservers(info);
          }  
}

public class Program implements Observer {

     public void update(Observable obj, Object arg) {
            String msg = ""; // Message to display on GUI

            if (arg instanceof UpdateInfo) {
                 //Print out the message and Debug int onto GUI...but how do I access them from `arg`
        }
    }

}

の型を にargすると、クラスが抽象ではないUpdateInfoというコンパイラ エラーが発生します....Program

これは正直で適切な質問ではありませんか?

4

1 に答える 1

5

クラスをキャストする必要があります。

 UpdateInfo ui = (UpdateInfo) arg;

内部instanceofでは、トリックを行う必要があります。

JavaのObservable/ ObserverAPI は本当に設計が悪いので、使用しないでください。真剣に-それは抽象クラスではなく、インターフェースであるべきでした。

オブザーバー パターンは非常に単純です。完全なタイプ セーフを使用して独自に実装するだけです。実際には、インターフェースのより優れたバージョンを指定しても効果はありません。たとえば、さまざまなListeners は、Java でのこのパターンの別のインスタンスであり、より適切に実行されます。リスナーには、適切なメソッド名と追加のデータを持つメソッドがあり、Adapter実装するメソッドが複数ある場合は抽象が存在し、多くの場合、それらのすべてが必要なわけではありません (例を参照MouseAdapter)。

したがって、不特定の「何かが起こった場合」のケースではなく、具体的なユースケースのパターンを再実装してください。パターンは、パターン ライブラリから抽象的に継承されるのではなく、実際には再実装されることを意図しています。

于 2012-12-14T23:26:59.143 に答える