私は小さなライブラリを設計していますが、時々数行を書き、それが正しくないと感じることがあります。そのため、経験豊富な 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 を使用して私のコードを最終的にきれいにするのは素晴らしいことです。
ご協力いただきありがとうございます !