public void foo() {
class Bar {
}
Bar b = new Bar();
}
メソッド ローカル クラスが最適な設計の選択肢となるような状況は見当たりません。使ったことはありますか?どんな場合?
public void foo() {
class Bar {
}
Bar b = new Bar();
}
メソッド ローカル クラスが最適な設計の選択肢となるような状況は見当たりません。使ったことはありますか?どんな場合?
異なる Swing コンポーネントにアタッチされた同じイベント リスナーのわずかに異なるパラメーター化されたバージョンが必要なときに、1 度か 2 度使用しましたが、それ以外は、名前付きのローカル クラスよりも匿名クラスを好む傾向があります。
これの簡単な例は次のようになります
public void attachListeners(final JLabel label) {
class ButtonListener implements ActionListener {
private String value;
public ButtonListener(String val) { value = val; }
public void actionPerformed(ActionEvent e) {
label.setText(value);
}
}
button1.addActionListener(new ButtonListener("value1"));
button2.addActionListener(new ButtonListener("value2"));
}
1 つのユースケースは、パラメータとして interface-type を持つメソッドへのループ呼び出しがあり、メソッドがそのメソッドでのみ使用される場合です。したがって、別のクラスを記述する代わりに、メソッド ローカル クラスを定義できます。(匿名クラスのアプローチが機能する場合もありますが、ループしている場合は、クラスを作成することをお勧めします。)
interface A{ public int getValue();}
....
public void processValue(A a){}
....
public void showResults(){
class B implements A{
int getValue(){
return value;
}
}
for (int i=0;i<10;i++){
processValue(new B())
}
}
キーと値のペアが必要で、キーが既存のクラスにマップされない状況で使用しました。メソッドの外で「キークラス」を利用できるようにしたくありませんでした。
例として、キーは と で構成できEmployee
、Date
値はその日のその従業員の予約時間です。このような状況では、次のようになります。
public void doExcitingCalculation() {
class EmployeeDateKey {
private Employee employee;
private Date date;
// Getters and setters ommited for brevity
}
Map<EmployeeDateKey, Double> bookedHours = new HashMap<>();
Map<Empoyee, Map<Date, Double>> temp = fetchData();
// This isn't a useful datastructure, so we remodel it
for (Map.Entry<Employee, Map<Date, Double>> entry : temp.entrySet()) {
for (Map.Entry<Date, Double> hours : entry.getValue().entrySet()) {
bookedHours.put(new EmployeeDateKey(entry.getKey(), hours.getKey()), hours.getValue());
}
}
// process data
}
メソッド ローカル クラスを使用すると、関連する部分がまとめられるため、コードの可読性が向上します。不自然な例として、バックグラウンドで何かを行うためにスレッドを作成する必要があるメソッドがあるとします。
class Test {
void f() {
// lots of stuff
new Thread(new Runnable() {
public void run() {
doSomethingBackgroundish();
}
}).start();
// lots more stuff
}
}
メソッド ローカル クラスがない場合は、次のいずれかを行う必要があります。
Test 内に新しい名前付きクラスを作成してバックグラウンド処理を行うか、別のソース ファイルに新しい名前付きクラスを作成してバックグラウンド処理を行います。これらのオプションはどちらも、関連する処理をソース ツリー内の別の場所 (同じソース ファイル内、または別のソース ファイル全体) に移動することで、コードの可読性を低下させる可能性があります。メソッド ローカル クラスを使用すると、処理ロジックが使用される場所に正しく保持されます。
これは確かにすべての状況に当てはまるわけではありませんが、多くの一般的な状況で非常に役立ちます。このようなコードは、通常、ある場所から別の場所にアクション メソッドの呼び出しを中継するだけの非常に小さなクラスである GUI アクション リスナーによく使用されます。