Java Goldで匿名クラスという不思議なものに初めて出会った方も多いと思います。何かと取っ付きにくい匿名クラスですが、仕組みさえ分かってしまえば簡単に理解することができます。
そこで今回は、匿名クラスの仕組みと使うべきシーンについてお伝えします。
匿名クラスの使い方
まずは匿名クラスの使い方を見ていきましょう。コードで見ていくのが分かりやすいです。
匿名クラスを使わない場合(比較対象)
public interface A{ void do(); } public B implements A{ public void do(){ System.out.println("Hello World"); } } public class Main{ public static void main(String[] args){ B b = new B(); b.do(); } }
非常に普通の記述ですね。インターフェースを実装したクラスを用意し、それをメインメソッドでnewして利用しています。
匿名クラスを使った場合
public interface A{ void do(); } public class Main{ public static void main(String[] args){ A a = new A(){ // メソッドの中でインターフェースを実装してしまう public void do(){ System.out.println("Hello World"); } }; a.do(); // 実装したdo()メソッドを呼び出し /* こんな書き方もあります */ new A(){ // 変数すら省略 public void do(){ System.out.println("Hello World"); } }.do(); } }
本来newできないインターフェースAを、newしているように見えます。しかし、実際はインターフェースAをnewしているわけではなく、名前のない実装クラス(匿名クラス)をnewしていると考えます。
メリット
上のコードを比べてみると分かるように、匿名クラスでは無駄なコード(実装クラスBの記述)が減っています。通常、インターフェースを実装したクラスを別の場所に作らなければなりませんよね。
匿名クラスはメソッドの中で直接実装してしまえるので、コードが簡潔になり把握しやすくなります。クラスファイル数が減るのでプロダクト管理もしやすくなります。
匿名クラスを使うシーン
匿名クラスによって、「インターフェースを使いたい場所で実装することができる」ことが分かりました。これはつまり、実装クラスは他で使い回せない(この場以外でnewして使うことができない)ことを表します。
よって、匿名クラスは「インターフェースを実装する必要があるけど、再利用することがない」といったシーンで使われます。
まとめ
文系でも分かるJavaの匿名クラスの使い方とメリットをご紹介しました。匿名クラスは、インターフェースを実装したクラスを使う箇所が1箇所しか無いときに(=再利用する予定がないときに)利用します。
最後までお読みいただきありがとうございました。