Java SE 9 の予習 その2
Java SE 9 の予習 その2です。
Java SE 8 でインタフェースにデフォルトメソッドと静的メソッドが実装できるようになりました。
しかし、使い勝手はお世辞にも良いとは言えませんでした。
Java でプログラムを組む上で重要なのはインタフェースの設計にあるからです。
デフォルトメソッドが実装された理由は Java SE 8 でインタフェースにメソッドを追加すると実装クラスに与える影響が大きく既存のプログラムに破綻を生じるケースも考えられたからです。
そんな事情からインタフェースにデフォルトメソッドが追加され実装がインタフェースにされるようになりました。
Java SE 9 からはさらにプライベートメソッドが実装できるようになります。
これでデフォルトメソッドの実装内容の非公開にしたい所をインタフェース経由で公開してしまうようなことは無くなります。
とりあえずプログラムを組んで動作確認をしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package jp.yucchi.privatemethodonjava9interface; /** * * @author Yucchi */ @FunctionalInterface public interface Eat { default void eatOnDefault() { eatStrawberryCake(); eatTiramisuCake(); eatCheeseCake(); eatChocolateCake(); } void eatStrawberryCake(); private void eatTiramisuCake() { System.out.println("I ate tiramisu cake."); oneMoreCake("TiramisuCake"); } private void eatCheeseCake() { System.out.println("I ate cheese cake."); oneMoreCake("cheese cake"); } private static void eatChocolateCake() { System.out.println("I ate chocolate cake."); // It is not possible to refer to a non-static method oneMoreCake(java.lang.String) from a static context. // oneMoreCake("chocolate cake"); } // コード共有を必要とするデフォルトメソッドがある場合にプライベートメソッドが使えると // 実装をインタフェース内に隠蔽できる。 private void oneMoreCake(String cake) { System.out.println("I will eat another " + cake + "."); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package jp.yucchi.privatemethodonjava9interface; /** * * @author Yucchi */ public class PrivateMethodOnJava9Interface { public static void main(String[] args) { final Eat eat = new Eat() { @Override public void eatStrawberryCake() { System.out.println("I ate strawberry cake. It was very delicious."); } // Private methods on the interface can not be overridden. // @Override private void eatTiramisuCake() { System.out.println("I ate tiramisu cake. It was very delicious."); } // Private methods on the interface can not be overridden. // @Override private void eatCheeseCake() { System.out.println("I ate cheese cake. It was very delicious."); } // Private static methods on the interface can not be overridden. // @Override private void eatChocolateCake() { System.out.println("I ate chocolate cake. It was very delicious."); } }; eat.eatOnDefault(); // eat.eatTiramisuCake(); // eatTiramisuCake() is accessed private by jp.yucchi.privatemethodonjava 9interface.Eat // eat.eatCheeseCake(); // eatCheeseCake() is accessed private by jp.yucchi.privatemethodonjava 9interface.Eat // Eat.eatChocolateCake(); // eatChocolateCake() is accessed private by jp.yucchi.privatemethodonjava 9interface.Eat } } |
このプログラムの実行結果は次のようになります。
I ate strawberry cake. It was very delicious.
I ate tiramisu cake.
I will eat another TiramisuCake.
I ate cheese cake.
I will eat another cheese cake.
I ate chocolate cake.
Java SE 9 ではこのような小さな改良がたくさんあるようです。(^_^)
TAGS: Java | 2017年2月28日4:03 PM | Comment : 0