0

私はJavaでいくつかの「簡単なこと」をやろうとしてきましたが、それはjavascriptでは次のようになります:

// Main class
var model = new Model();
this.callback = function(e){/* do something */}
model.addListener("change", callback);

Javaでこれまでに見つけたのは、java.util.Observerから派生したメインクラスとjava.util.Observableから派生したモデルを作成することです。次に、モデルがイベントをディスパッチするときに、Main クラスの update メソッドを呼び出します。私は本当に醜く、エレガントではないと感じました。これをどのように扱うことができるかさえ考えられません。

このようにする方法について受け入れられるチュートリアルが見つからないため、ここで私を助けるためのいくつかのライブラリなど、よりクリーンで柔軟な方法はありますか?

どうもありがとう

これまでに管理してきたことは、単純なイベントのためだけに「空の」クラスを作成するよりもはるかに気に入っています (ただし、少なくとも私にとってはまだ良くありません)。

private ArrayList __items;
public void addListener(Method method, Object object){
    this.__listeners.add(new Object[] {method, object});
}


public void dispatch(){
    int i = this.__listeners.size();
    Method method;
    Object context;
    while(i>0){
        i--;
        method = (Method)(this.__listeners.get(i))[0];
        context = (Object)(this.__listeners.get(i))[1];
        try{
            method.invoke(context);
        }catch(java.lang.reflect.InvocationTargetException e){

        }catch(java.lang.IllegalAccessException e){

        }
    }
}

次に、次のように使用します。

Gifts gifts = prendastotty.PrendasTotty.getMain().getLoggedUserGifts();
Class[] parameterTypes = new Class[0];
try{
    Method m = Home.class.getMethod("__updateTable", parameterTypes);
    gifts.addListener(m, this);
}catch(NoSuchMethodException e){

}

これは漏れやすい/アンチパターン/バグですか?

4

3 に答える 3

2

私の頭の中でいくつかのものが意味をなさなかったので、私はあなたのコードに追いつくのに少し苦労したと言わなければなりません(Javaの考え方、または少なくとも私のJavaの考え方から)。だから私はあなたを正しく理解し、あなたを助けることができることを願っています。

まず、簡単な例を見てみましょう。

var model = new Model();
this.callback = function(e){/* do something */}
model.addListener("change", callback);

たとえば、Javaの場合、適切なアプローチは次のようになります。

public interface ModelListener {
   public void execute(Model context);
}

public class Model { 
    private List<ModelListener> listeners;

    public Model() {
      this.listeners = new ArrayList<ModelListener>();
    }

    public void addListener(ModelListener listener) {
      this.listeners.add(listener);
    }

    public void dispatch() {
      for (ModelListener listener: listeners) {
        listener.execute(this);
      }
    }

}

この種の設計を使用すると、次の2つのいずれかを実行できます。

匿名クラスを使用する

Javaで最も一般的なケースは、すべてのクラスに名前が付いている場合です。匿名クラスを作成できる場合もありますが、これらは基本的にインラインで実装されるクラスです。それらはインラインで実装されているため、通常は小さい場合にのみ使用され、再利用できないことがわかっています。

例:

Model model = new Model();
model.add(new ModelListener() {
     public void execute(Model model) { /* do something here */ }
});

新しいModelListenerオブジェクト(インターフェイス)がどのように作成され、execute実装がインラインで提供されているかに注目してください。それが匿名のクラスです。

インターフェイスの実装

インターフェイスを実装するクラスを作成し、匿名クラスの代わりにそれらを使用できます。このアプローチは、リスナーを再利用可能にしたり、コードにセマンティックな意味を与える名前を付けたり、コードの数行だけではないロジックである場合によく使用されます。

例:

public class LogListener implements ModelListener {

 public void execute(Model model) {
   // Do my logging here
 }
}

Model model = new Model();  
model.addListener(new LogListener());

サイドノート

ちなみに、リスナーとしてバインドしようとしているメソッドが呼び出されたのを見ました__updateTableが、データベースにコミットできるように、オブジェクトの変更を検出しようとしていますか?もしそうなら、 HibernateJPAなどのいくつかのORMフレームワークを検討することを強くお勧めします。これらのフレームワークは、変更を追跡し、データベースにコミットすることで、面倒なことをすべて防ぎます。

ポルトガル語のStackOverflowユーザーの仲間からのよろしくお願いします;)

于 2012-12-06T23:19:46.377 に答える
0

Java では、関数は Javascript のようにクラスの外には存在できません。そのため、実行時に関数の実装を提供する必要がある場合は、残念ながらその関数をクラス内にラップして、クラスのインスタンスを渡す必要があります。

リフレクションを使用したソリューションは機能しますが (私は推測します)、Java でそれを行うには推奨される方法ではありません。これは、以前はコンパイル時エラーだったものが実行時エラーになるためです。

于 2012-12-06T22:52:11.857 に答える
0

JavaScript のイデオロギーを Java に直接マップするのは少し難しいと思います。彼らの根底にある哲学は異なります。より明確なコードと期待がなければ、より明確な答えを出すことは困難です。クリック ハンドラをボタンにアタッチするGWT( で記述)のコードのサンプルを次に示します。java

これが開始に役立つことを願っています。

 myButton.addSelectionListener(new SelectionListener<ComponentEvent>(){
                @Override
                public void componentSelected(ComponentEvent ce) {
                    // do your processing here                          

                }

            });
于 2012-12-06T22:01:57.467 に答える