ユーザーインターフェイスベースのJavaプログラムで作業する場合、動作を特定のアクション(ボタンのクリックなど)に関連付ける1つの方法は、匿名クラスを使用することです。以下の例では、GUIフレームワークはSWTですが、SwingまたはAndroid UIコンポーネントでも同じ問題があります。つまり、私のプログラムの構造化です。
MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE);
sampleMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
doSomething();
// handle all table entries
for (int i=0; i<10; i++) {
doSomething2();
}
doSomething3();
doSomething4();
}
});
もちろん、上のサンプルのコードの量はすでにロジックを含む専用クラスの作成を保証していると主張する人もいます。これは、Sonarの「匿名クラスは行が多すぎてはならない」という規則によっても示唆されています。
興味深いことに、このルールは次のことも指定しています。
squid:S1188-Javaでのクロージャーのサポートを待つ間、匿名クラスは、専用クラスを作成せずに動作を注入する最も便利な方法です。ただし、これらの匿名内部クラスは、動作が数行で実行できる場合にのみ使用してください。より複雑なコードでは、名前付きクラスが必要です。
ただし、Javaにはまだクロージャーが到着していないため、私の質問は次のようなエレガントな解決策があるかどうかです。
- あらゆる種類の欠点(再利用が制限されている、コード内の移動が遅い、など)がある匿名クラス内で一連のコードを書く
- 膨大な数の専用クラスを作成し、それ自体が非常に限られた機能しか持たない可能性があります(つまり、オーバーエンジニアリングなど)。
私の質問を拡張します。JavaベースのUIアプリケーションのこの側面に関するベストプラクティスは何ですか?確立されたパターンはありますか?