Java - 匿名クラス
こんにちは、将来のJavaの魔法使いたち!今日は、Javaの匿名クラスの世界に興味深い旅をすることになります。プログラミングが初めてであっても心配しないでください。私はこの概念をステップバイステップで案内し、多くの例と説明を提供します。それでは、さっそく始めましょう!
匿名クラスとは?
想象して、マスカレードパーティにいるとします。誰もがマスクを付けていて、誰が誰であるか分かりません。それは、Javaの匿名クラスと少し似ています。匿名クラスは名前のないクラスで、コードのマスクの背後に隠されています!
匿名クラスは、名前のない特別な内部クラスで、new
キーワードを使用して単一の式で宣言およびインスタンス化されます。
匿名クラスを使う理由
- 一度だけ使うのに適しています。
- コードを簡潔に保つのに役立ちます。
- シンプルなインターフェースを実装するか、クラスを即座に拡張するのに最適です。
匿名クラスの定義方法
簡単な例から始めましょう:
interface Greeting {
void greet();
}
public class AnonymousClassDemo {
public static void main(String[] args) {
Greeting englishGreeting = new Greeting() {
@Override
public void greet() {
System.out.println("Hello, World!");
}
};
englishGreeting.greet();
}
}
この例では、匿名クラスを使用してGreeting
インターフェースを実装しています。以下に分解します:
- シンプルな
Greeting
インターフェースを定義し、1つのメソッドgreet()
を持ちます。 -
main
メソッド内で、匿名クラスを使用してGreeting
のインスタンスを作成します。 - 匿名クラスは
greet()
メソッドの実装を提供します。 -
englishGreeting
オブジェクトのgreet()
メソッドを呼びます。
このコードを実行すると、「Hello, World!」がコンソールに表示されます。
Javaにおける匿名内部クラスの種類
Javaには、主に以下の3つの匿名内部クラスがあります:
- クラスを拡張する匿名クラス
- インターフェースを実装する匿名クラス
- メソッド/コンストラクタ引数内で定義される匿名クラス
それぞれの例を見てみましょう:
1. クラスを拡張する匿名クラス
abstract class Animal {
abstract void makeSound();
}
public class AnonymousClassExtend {
public static void main(String[] args) {
Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("Woof! Woof!");
}
};
dog.makeSound();
}
}
この例では、抽象クラスAnimal
を拡張する匿名クラスを作成し、makeSound()
メソッドの実装を提供しています。
2. インターフェースを実装する匿名クラス
初めての例で見たように、もう一つも見てみましょう:
interface Calculatable {
int calculate(int a, int b);
}
public class AnonymousClassImplement {
public static void main(String[] args) {
Calculatable adder = new Calculatable() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
System.out.println("5 + 3 = " + adder.calculate(5, 3));
}
}
この匿名クラスはCalculatable
インターフェースを実装し、2つの数を足すcalculate()
メソッドの実装を提供しています。
3. メソッド/コンストラクタ引数内で定義される匿名クラス
public class AnonymousClassArgument {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Anonymous thread is running!");
}
});
t.start();
}
}
ここでは、Runnable
インターフェースを実装する匿名クラスをThread
コンストラクタの引数として直接作成しています。
匿名クラスの使用時期
匿名クラスは以下の状況で特に有用です:
- インターフェースを実装するか、クラスを拡張する必要があるが、一度だけ使用する場合。
- 実装が非常に短くてシンプルな場合。
- シンプルな操作のための別の名前付きクラスを作成することを避けたい場合。
しかし、同じ匿名クラスを複数回使用する場合は、名前付きクラスを作成する方が良いかもしれません。
匿名クラスの制限
匿名クラスは強力ですが、いくつかの制限があります:
- 同時に1つのインターフェースを実装するか、1つのクラスを拡張するだけです。
- ステートメントやメンバーエイリアスを持つことはできません。
- コンストラクタを持つことはできません(名前がないため)。
結論
Javaの匿名クラスは、コードの中の秘密工作員のようです。彼らは現れて、仕事をし、名前を残さずに消えます。匿名クラスは、簡潔で読みやすいコードを作成するための強力なツールです。
このプログラミング概念については、練習が成功の鍵です。自分で匿名クラスを作成し、さまざまな使用例を試してみてください。間もなく、あなたも匿名クラスをまるでJavaの忍びのように扱えるようになるでしょう!
ハッピーコーディングを、そしてあなたの匿名クラスがいつも「Hello, World!」であなたを迎えることを願っています!
Credits: Image by storyset