関数型インターフェース

関数型インターフェースとは、抽象メソッドを1つしか持たないインターフェースのことです。ただし、defaultメソッドやstaticメソッドは持っていても構いません。
RunnableというJavaのクラスライブラリに元々あるインターフェースを見てみましょう。run(実行する)という抽象メソッドがあります。
抽象メソッドは1つだけなので、FunctionalInterfaceアノテーションを宣言の前(1行目)に指定しています。
アノテーションは注釈という意味です。抽象メソッドが1つだけなら関数型インターフェースになるのですが、FunctionalInterfaceアノテーションで明示的に宣言するのが良いでしょう。

関数型インターフェースの実装

Runnableインターフェースを、まずは普通に実装していきます。implementsキーワードを使います。
クラス名はとしてみました。メソッドをオーバーライドしています。
このメソッドはOverrideだよと明言しているのがOverrideアノテーションです。引数の数の指定やデータ型の記述ミスで、予期せぬオーバーライドやオーバーライド失敗を防ぐための注釈です。なくても良いのですが、書いておいた方が安全です。
処理の中では、Exampleを実行しましたメッセージをprintlnしています。
Exapmleクラスを実行する側のmainメソッドについて、見ていきたいと思います。
Exampleクラスをnewして、Runnableインターフェース型の変数eに代入しています。として実行しています。
Runnableインターフェースはマルチスレッドのプログラムを作るためのものなので、本来このようなやり方はしないのですが、伝わりやすくしようと、今回採用しています。
実際に実行すると、コマンドラインに「Exampleを実行しました。」メッセージが出力されるわけです。
でも、これをやりたいだけなのに、Runnableインターフェースも含めると3つのファイルを使っているのです。
  • Runableインターフェース
  • Runableインターフェースを実装するクラス
  • mainメソッドを持つクラス
この中の、Runnableインターフェースを実装しているExampleクラスって、本当に必要なのでしょうか?ということで、次のような記述ができるようになっているのです。

内部クラスにする

Exampleクラスを、mainメソッドを持つクラスの中に宣言します。クラスの中に記述されているクラスを内部クラスと呼びます。
こうすると、mainメソッドの中からExampleクラスを呼び出すことができます。mainメソッドの中は先ほどと同じです。

匿名クラスにする

一時的な使い捨てのクラスとしての用途です。
classの宣言も、クラス名もありません。Runnableインターフェースをnewしています。実際にはインターフェースをnewしているのではなく、匿名クラスをnewしているのがポイントです。
内部クラスの時よりも、書式が簡潔になりました。privateなスタティックclassを作る必要もありません。
これを匿名クラスと呼びます。