【Java】匿名クラス(無名クラス)を使いこなそう! 匿名クラスの使い方と利点を解説!

  • このエントリーをはてなブックマークに追加

今回は、Javaの匿名クラス(無名クラス)について解説します。

匿名クラスとは

匿名クラスを使うと、新しくクラスを記述せずともあるインターフェースや抽象クラスを実装し、インスタンスとして扱うことができます。語弊を恐れずに簡単に言うと、「使い捨てクラス」のようなものです。

C#の匿名型とは全く異なるものです。

匿名クラスの例

Java
public abstract class SuperClass { // 抽象クラス
    public void sayHello() {
        System.out.println("こんにちは!");
    }
    
    public abstract void abstractMethod(); // 抽象メソッド
}
Java
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()をオーバーライドしています。

匿名クラスの利点

匿名クラスを利用しない場合と比較

もし匿名クラスを利用しない場合、次のような新しいクラスを実装する必要があります。

Java
import..

public class DerivedClass extends SuperClass {
    @Override
    public void abstractMethod() {
        System.out.println("ハロー!");
    }
}

一度しか使わないようなインターフェースや抽象クラスの実装は、匿名クラスを利用することでより簡潔に書くことができます。

SuperClassは先ほど示したものと同じです。

同じスコープ内の変数を利用することができる

匿名クラスを利用することの利点として、「匿名クラスの実装の中であっても同じスコープ内の変数を利用することができる」があります。

サンプルコード:

Java
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は先ほど示したものと同じです。

備考

普通のクラスの継承で匿名クラスを扱う

当然、インターフェースや抽象クラスでなくても匿名クラスを作成することが出来ます

サンプルコード:

Java
public class People {
    public void sayHello() {
        System.out.println("Hello");
    }
}
Java
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を継承した匿名クラスを作り、インスタンスjapanesePeoplechinesePeoplehogePeopleを作成しました。

まとめ

今回は、Javaの匿名クラス(無名クラス)について説明しました。例のように、適切な箇所で匿名クラスを利用すると、普通にクラスを実装するよりも簡潔に記述することが出来ます。特に、そのクラスを一度しか使わない場合は、匿名クラスに書き換えるとよりコードがスッキリします。

最後までお読みいただきありがとうございました!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*