📑

プログラミング自主学習 DAY56 ネストインタフェース/匿名型オブジェク

2023/07/22に公開

ネストインタフェース

クラスの中にある、インタフェースであり、該当クラスと繋がるオブジェクトを具現するために活用される。主にアンドロイド開発の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)

今までは、クラスとインタフェースを外部クラスに宣言してみた。
しかし、匿名型は明示的にクラスを宣言せずに、素早くオブジェクトを生成することができる。

主に、フィールド、ローカル変数、パラメータとして使われる。

匿名オブジェクトを作成する方法は二つがある。

  1. クラスを継承する ➡ 匿名サブオブジェクト
  2. インタフェースを具象する ➡ 匿名インタフェースオブジェクト

匿名サブオブジェクト

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