はじめに
ローカルクラス、無名クラス、ラムダ式は似ている部分も多く、最初は違いが分かりにくいです。この記事では3つの書き方の違いを簡単にまとめてみました。
ローカルクラス
特徴
- メソッドの中で定義するクラス
- 名前を持つ
- インスタンスを繰り返し生成できる
サンプルコード
public class Main {
public static void main(String [] args) {
class Greeting {
void sayHello() {
System.out.println("Hello from Local Class!");
}
}
Greeting g1 = new Greeting();
Greeting g2 = new Greeting();
g1.sayHello();
g2.sayHello();
}
}
Hello from Local Class!
Hello from Local Class!
無名クラス
特徴
- クラス名がない
- 「1回だけ使うクラス」を、その場で書いてすぐインスタンス化
- 抽象クラスやインターフェースの実装に便利
サンプルコード
public class Main {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello from Anonymous Class!");
}
};
r.run();
}
}
Hello from Anonymous Class!
ラムダ式
特徴
- 無名クラスの省略記法
- 抽象メソッドが1つだけのインターフェース=関数型インターフェース限定
- Java 8から使える
サンプルコード
public class Main {
public static void main(String[] args) {
Runnable r = () -> System.out.println("Hello from Lambda!");
r.run();
}
}
Hello from Lambda!
まとめ
| 特徴 | ローカルクラス | 無名クラス | ラムダ式 |
|---|---|---|---|
| 名前 | あり | なし | なし |
| 再利用性 | 複数回可 | 1回限り | 1回限り |
| 実装対象 | 任意のクラス | 任意のクラス/インターフェース | 関数型インターフェース |
| 記述の簡潔さ | 普通 | 簡潔 | 最も簡潔 |
| 主な用途 | 複雑な処理をメソッド内でまとめる | GUI, スレッド処理 | ストリーム, 並列処理 |