Interfaceの中の内部クラス
http://twitter.com/t_yano/statuses/851859558
id:t_yanoのtwitterより。
Interfaceの中に内部Classを定義できる。知らんかった…。
ってことで、どんな場合に利用できるか考えてみた。
- Interfaceで提供されるメソッドのパラメータクラスとかを内部クラスにして定義しておく。ついでにデフォルト値も入れておく、など。
- 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(); } }