0

私は小さなライブラリを設計していますが、時々数行を書き、それが正しくないと感じることがあります。そのため、経験豊富な Java プログラマーの意見やアドバイスを得たいと思います。

3 つの異なるイベントを処理するリスナーがあり、クラスの 1 つで、実際にイベントを発生させるメソッドを実装しています。

だから私が最初にしたことは次のようなものでした:

 protected final void fireOperationStarted(){
     OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
        listener.operationStarted(event);
    }
}


protected final void fireOperationEnded(){
    OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
        listener.operationEnded(event);
    }

//omitted the 3rd method on purpose

しかし、誰かが独自のイベントを実装したい場合、基本的にリスナー配列リスト全体 (CopyOnWriteArraylist) にアクセスし、何度も何度もロジックを記述する必要があるため、このコードは間違っていると感じました。

そこで私が選んだのは、単一のメソッド「fire」を持つ Fireable インターフェースです。そして、これは私がやったことです:

protected final void fireOperationStarted(){
fireOperation(new Fireable(){

    @Override
    public void fire(OperationListener listener, OperationEvent event) {            
        listener.operationStarted(event);
    }

});
}

 protected final void fireOperationEnded(){
fireOperation(new Fireable(){

    @Override
    public void fire(OperationListener listener, OperationEvent event) {            
        listener.operationEnded(event);
    }

});
}

protected void fireOperation(Fireable fireable){

    OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
    fireable.fire(listener, event);
    }
}

皆さんの意見をお聞きしたいのですが、個人的には定型コードがまだたくさんありますが、最初の実装よりも優れていると思います。多分これを行うためのより良い方法がありますか?java.awt.events パッケージのソース コードを調べて、複数のイベントをどのように処理し、どのように起動するかを確認しましたが、私のニーズには複雑すぎるようです。

私が疑問に思っていたことの 1 つは、Java 8 のラムダ式についてです。Java 8 パッケージをインポートせずにそれらを使用してコンパイルすると、JRE7 で動作しますか?

JDK8 を使用して私のコードを最終的にきれいにするのは素晴らしいことです。

ご協力いただきありがとうございます !

4

1 に答える 1

0

あなたの最初の例の方が良いと思います。 listenersはインスタンス フィールドでなければならず、誰でも簡単に利用できます。

(OperationListener に 1 つのメソッドしかなく、OperationEvent の値を使用して関連するアクションを判別する場合があります。その場合、すべてのメソッドが、1 つのリスナー メソッドを呼び出す 1 つのメソッドに適切なイベントを渡すことができます。)

2番目のアイデアは興味深いですが、1つのクラスの1つのインスタンス内で使用するには、やり過ぎだと思います。

リスナーを格納するには、さまざまな方法があります。それらを追加したり削除したりするのが速すぎない場合は、ArrayList が適しています。異なるスレッドでそれらを追加および削除する可能性があり、リスナーを頻繁に呼び出す場合は、CopyOnWriteArrayList の方がはるかに優れています。

「ボイラープレート」についてあまり心配しないでください。Java は、低レベルのコードに関しては、冗長だが単純な傾向があります。最初の例の 2 つのループは、何らかの方法で結合する必要がありますが、より多くforのループを取得するまで心配する必要はありません。

ラムダはコードの行数を減らします (単純なものを使用する場合、私の C# ラムダはすべて 20 行以上を実行することになります。匿名クラスも同様です!) が、言語マニュアルに多くのページを追加します。ただし、ラムダは JRE 8 まで存在しません。

于 2013-07-09T18:36:02.217 に答える