読者です 読者をやめる 読者になる 読者になる

( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

Interfaceの中の内部クラス

Java

http://twitter.com/t_yano/statuses/851859558
id:t_yanotwitterより。
Interfaceの中に内部Classを定義できる。知らんかった…。


ってことで、どんな場合に利用できるか考えてみた。

  1. Interfaceで提供されるメソッドのパラメータクラスとかを内部クラスにして定義しておく。ついでにデフォルト値も入れておく、など。
  2. Interfaceのデフォルトの振舞いを実装する具象クラスデフォルト実装のXXXImplとかをトップレベルクラスではなく、内部クラスにしておく。


って書いてみたけど、これと言ってメリットってないよなぁ。
なんかトリッキーな書き方ができそうな気がするんだが。


「プログラミング言語Java」第4版を買ってきた - 矢野勉のはてな日記
俺も「プログラミング言語Java」第4版買ってきます。
あまりに勉強不足。
JDKのソースとかで、効果的に利用されている箇所があったら参考にしたいところだ。
Map.Entryとかは、Interfaceの中のInterfaceだけど。
誰か教えて。



サンプルとして書いてみたけどいまいち。


IncludeInnerClass.java

public interface IncludeInnerClass {
	
	void doSomething1( ParamInnerClass inner);
	void doSomething2();

	// デフォルト値を持つパラメータクラスとして
	class ParamInnerClass{
		public String param1 = "Default Param1";
		public int param2 = 99;
	}
	
	// Interfaceのデフォルトの振舞いを持つ具象クラスとして
	class DefalutIncludeInnerClass implements IncludeInnerClass{

		String defaultValue = "This is default";
		
		public void doSomething1( ParamInnerClass inner) {
			
			System.out.println( defaultValue + ":" + inner.param1 + ":" + inner.param2);
		}
		
		public void doSomething2(){
			System.out.println( defaultValue  + "- doSomething2()");
		}
		
	}
}

IncludeInnerClassSample.java

public class IncludeInnerClassSample {

	public static void main( String [] args ){
		
		IncludeInnerClass ic1 = new IncludeInnerClass(){
			
			public void doSomething1( ParamInnerClass inner) {
				
				System.out.println( "This is anonymous :" + inner.param1 + ":" + inner.param2);
			}
			
			public void doSomething2(){
				System.out.println( "This is anonymous - doSomething2()");
			}

		};
		
		// デフォルトのパラメータを使用する
		ic1.doSomething1( new IncludeInnerClass.ParamInnerClass());
		ic1.doSomething2();
		
		// Interfaceのデフォルト実装を利用する
		IncludeInnerClass ic2 = new IncludeInnerClass.DefalutIncludeInnerClass();
		ic2.doSomething1(new IncludeInnerClass.ParamInnerClass(){
			{
				param1 = "Anonymous Param1";
				param2 = 0;
			}
		});
		ic2.doSomething2();
		
	}
}