📑
プログラミング自主学習 DAY56 ネストインタフェース/匿名型オブジェク
ネストインタフェース
クラスの中にある、インタフェースであり、該当クラスと繋がるオブジェクトを具現するために活用される。主にアンドロイド開発のUIでイベントを活用するために活用されるようだ。
class Button
[public | private | static] interface Click{
}
}
public class Button {
public static interface ClickListener{
void onClick();
}
private ClickListener clickListener;
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public void click() {
this.clickListener.onClick();
}
}
public class ButtonExample {
public static void main(String[] args) {
Button btnEnt = new Button();
class EnterListener implements Button.ClickListener{
@Override
public void onClick() {
System.out.println("ENTER");
btnOk.setClickListener(new EnterListener());
btnOk.click();
//-----------------------------------------------------
Button btnSpace = new Button();
class SpaceListner implements Button.ClickListener{
@Override
public void onClick() {
System.out.println("SPACE");
}
}
btnSpace.setClickListener(new SpaceListner());
btnSpace.click();
}
}
ENTER
SPACE
事前に外部クラスには3つが必要だ。
1.インタフェースタイプのprivateフィールド、
2.フィールドを使用するsetterメソッド(パラメーターのポリモーフィズム)
3.setされたfieldを利用する外部クラスのメソッド
匿名型オブジェクト(Anonymous Object)
今までは、クラスとインタフェースを外部クラスに宣言してみた。
しかし、匿名型は明示的にクラスを宣言せずに、素早くオブジェクトを生成することができる。
主に、フィールド、ローカル変数、パラメータとして使われる。
匿名オブジェクトを作成する方法は二つがある。
- クラスを継承する ➡ 匿名サブオブジェクト
- インタフェースを具象する ➡ 匿名インタフェースオブジェクト
匿名サブオブジェクト
new Superclass(...){
//field
//method
}
Tire
public class Tire {
public void roll() {
System.out.println("Tire is rolling.");
}
}
Car
public class Car {
//field
private Tire tire1 = new Tire();
//field + anonymous object
private Tire tire2 = new Tire() {
@Override
public void roll() {
System.out.println("tire ???1 is rolling ");
}
};
//method(use field)
public void run1() {
tire1.roll();
tire2.roll();
}
//method + anonymous object (use local variable)
public void run2() {
Tire tire = new Tire() {
@Override
public void roll() {
System.out.println("tire ???2 is rolling ");
}
};
tire.roll();
}
//method + anonymous object (use Parameter)
public void run3(Tire tire) {
tire.roll();
}
}//class
public class CarExample {
public static void main(String[] args) {
Car car = new Car();
car.run1();
car.run2();
car.run3(new Tire(){
@Override
public void roll() {
System.out.println("tire ???3 is rolling ");
}
});
}
}
Tire is rolling.
tire ???1 is rolling
tire ???2 is rolling
tire ???3 is rolling
匿名インタフェースオブジェクト
new Interface(...){
//field
//method
}
Interface
public interface RemoteControl {
void turnOn();
void turnOff();
}
HomeClass
public class Home {
//field + Anonymous
private RemoteControl rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("Turn on TV");
}
@Override
public void turnOff() {
System.out.println("Turn off TV");
}
};
//method (use field)
public void use1() {
rc.turnOn();
rc.turnOff();
}
//method (use local variable)
public void use2() {
RemoteControl rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("Turn on Aircon");
}
@Override
public void turnOff() {
System.out.println("Turn off Aircon");
}
};
rc.turnOn();
rc.turnOff();
}
//method (use parameter)
public void use3(RemoteControl rc) {
rc.turnOn();
rc.turnOff();
}
}
HomeExample
public class HomeExample {
public static void main(String[] args) {
Home myhome = new Home();
myhome.use1();
myhome.use2();
myhome.use3(new RemoteControl() {
@Override
public void turnOn() {
System.out.println("Turn on Audio");
}
@Override
public void turnOff() {
System.out.println("Turn off Audio");
}
});
}
}
ButtonExample
public class ButtonExample {
public static void main(String[] args) {
Button btnEnt = new Button();
btnEnt.setClickListener(new Button.ClickListener() {
@Override
public void onClick() {
System.out.println("ENTER");
}
});
btnOk.click();
Button btnSpace = new Button();
btnSpace.setClickListener(new Button.ClickListener() {
@Override
public void onClick() {
System.out.println("SPACE");
}
});
btnSPACE.click();
}
Discussion