この記事では、インターフェースを直接インスタンス化しているように見える方法を解説します。いったい何を解説するのかという感じですが、インターフェースをその場で実装して、インスタンス化する方法です。
インターフェースを実装したクラスを用意してインスタンス化
インターフェースは直接インスタンス化できないので、インターフェースを実装したクラスを用意してインスタンス化してみます。(直接インスタンス化しない方法)
例えばこんなコードです。
Java
public class Main {
public static void main(String[] args) {
Controller c = new TvController();
SomeFunc(c);
}
public static void SomeFunc(Controller c) {
c.turnOn();
c.turnOff();
}
}
interface Controller {
void turnOn();
void turnOff();
}
class TvController implements Controller {
@Override
public void turnOn() {
System.out.println("Turn on!");
}
@Override
public void turnOff() {
System.out.println("Turn off!");
}
}
SomeFunc関数を呼び出すために、Controllerインターフェースを実装したTvControllerで実装しています。
Android開発などをしていると、特定のインターフェースを実装したクラスのインスタンスを渡すことが多いですが、この方法では面倒ですね。
匿名クラスを利用してインスタンス化(直接インスタンス化)
前節では、インターフェースを実装したクラスを用意してインスタンス化し、それを関数に渡していました。匿名クラス(名前のないクラス)を使えば、その場でインターフェースを実装した匿名のクラスを定義しインスタンス化することができます。
前節のコードを匿名クラスで書き換えてみます。
Java
public class Main {
public static void main(String[] args) {
Controller c = new Controller() {
@Override
public void turnOn() {
System.out.println("Turn on!");
}
@Override
public void turnOff() {
System.out.println("Turn off!");
}
};
SomeFunc(c);
}
public static void SomeFunc(Controller c) {
c.turnOn();
c.turnOff();
}
}
interface Controller {
void turnOn();
void turnOff();
}
3行目で、Controllerインターフェースを実装した匿名クラスを定義し、それと当時にインスタンス化しています。(これが私が勝手に直接インスタンス化と言っている内容です。)
こちらの方法だと、例えば1回だけ特定のインターフェースを実装したクラスのインスタンスが必要な時などに、前節の方法に比べて比較的楽にコーディングできますね。android開発でイベントリスナーを設定するときなどによく使います。
まとめ
- 匿名クラスを使うと、その場でインターフェースを実装したクラスの定義と、インスタンス化ができる(インターフェースを直接インスタンス化できる)
コメント