今回は、Javaの匿名クラス(無名クラス)について解説します。
匿名クラスとは
匿名クラスを使うと、新しくクラスを記述せずともあるインターフェースや抽象クラスを実装し、インスタンスとして扱うことができます。語弊を恐れずに簡単に言うと、「使い捨てクラス」のようなものです。
C#の匿名型とは全く異なるものです。
匿名クラスの例
public abstract class SuperClass { // 抽象クラス
public void sayHello() {
System.out.println("こんにちは!");
}
public abstract void abstractMethod(); // 抽象メソッド
}
import..
public class Program {
public static void main(String[] args) {
SuperClass anonymous = new SuperClass() {
@Override
public void abstractMethod() { // 抽象メソッドのオーバーライド
System.out.println("ハロー!");
}
};
anonymous.sayHello(); // 「こんにちは」と出力される
anonymous.abstractMethod(); // 「ハロー!」と出力される
}
}
[実行結果]
こんにちは!
ハロー!
この例では、抽象クラス SuperClass
を実装する匿名クラスを作成しています。匿名クラス内でスーパークラスの抽象メソッドabstractMethod()
をオーバーライドしています。
匿名クラスの利点
匿名クラスを利用しない場合と比較
もし匿名クラスを利用しない場合、次のような新しいクラスを実装する必要があります。
import..
public class DerivedClass extends SuperClass {
@Override
public void abstractMethod() {
System.out.println("ハロー!");
}
}
一度しか使わないようなインターフェースや抽象クラスの実装は、匿名クラスを利用することでより簡潔に書くことができます。
SuperClass
は先ほど示したものと同じです。
同じスコープ内の変数を利用することができる
匿名クラスを利用することの利点として、「匿名クラスの実装の中であっても同じスコープ内の変数を利用することができる」があります。
サンプルコード:
import..
public class Program {
public static void main(String[] args) {
String myMessage = "釧路はええとこやで〜";
new SuperClass() {
@Override
public void abstractMethod() {
System.out.println(myMessage); // 同じスコープ内の変数myMessageを利用することができる
}
}.abstractMethod();
}
}
[実行結果]
釧路はええとこやで〜
SuperClass
は先ほど示したものと同じです。
備考
普通のクラスの継承で匿名クラスを扱う
当然、インターフェースや抽象クラスでなくても匿名クラスを作成することが出来ます
サンプルコード:
public class People {
public void sayHello() {
System.out.println("Hello");
}
}
import..
public class Program {
public static void main(String[] args) {
var people = new People(); // 普通のPeopleクラスのインスタンス
var japanesePeople = new People() {
@Override
public void sayHello() {
System.out.println("こんにちは");
}
};
var chinesePeople = new People() {
@Override
public void sayHello() {
System.out.println("你好");
}
};
var hogePeople = new People() {
@Override
public void sayHello() {
super.sayHello(); // 匿名クラス内でもsuperキーワードを利用できる
}
};
people.sayHello(); // -> Hello
japanesePeople.sayHello(); // -> こんにちは
chinesePeople.sayHello(); // -> 你好
hogePeople.sayHello(); // -> Hello
}
}
[実行結果]
Hello
こんにちは
你好
Hello
この例では、クラスPeople
を継承した匿名クラスを作り、インスタンスjapanesePeople
、chinesePeople
、hogePeople
を作成しました。
まとめ
今回は、Javaの匿名クラス(無名クラス)について説明しました。例のように、適切な箇所で匿名クラスを利用すると、普通にクラスを実装するよりも簡潔に記述することが出来ます。特に、そのクラスを一度しか使わない場合は、匿名クラスに書き換えるとよりコードがスッキリします。
最後までお読みいただきありがとうございました!