Java 8の改良インターフェース

2743 ワード

Java 8はインターフェースでデフォルトの方法を定義することができます.デフォルトの方法はdefault修飾を使用しなければなりません.この方法はstatic修飾を使用できません.プログラムが指定されていても、デフォルトの方法はいつもpublic修飾を使用します.開発者がpublicを指定していないと、自動的にデフォルトの方法にpublic修飾を追加します.デフォルトの方法はstatic修飾がありません.したがって、直接にインターフェースを使用してデフォルトの方法を呼び出すことはできません.インターフェースの実装クラスの例を使用して、これらのデフォルトの方法を呼び出す必要があります.
Java 8はインターフェースでクラスの方法を定義することを許可して、クラスの方法はstaticを使用しなければならなくて、この方法はdefaultを使って修飾することができなくて、プログラムが指定するかどうかに関わらず、種類の方法はいつもpublicを使って修飾します.
インターフェース定義の例
public interface Output {
    int MAX_CACHE_LINE = 50;

    void out();

    void getData(String msg);

    //           
    default void print(String... msg) {
        Arrays.asList(msg).forEach(m -> System.out.println(m));
    }

    default void print_v2(String... msg) {
        for (String m : msg) {
            System.out.println(m);
        }
    }

    //           
    static String staticTest() {
        return "        ";
    }

    static String staticTest_v2() {
        return "        _v2";
    }
}
public class OutputImpl implements Output {

    @Override
    public void out() {
        System.out.println("out invoke");
    }

    @Override
    public void getData(String msg) {
        System.out.println("getData invoke");
    }
}
インスタンスを使う
        Output output = new OutputImpl();
        //         
        output.out();
        output.getData("hello");

        // default    
        output.print("hello", "indian mi fan", "are you ok?");
        output.print_v2("thank", "you");

        // static    
        System.out.println(Output.staticTest());
        System.out.println(Output.staticTest_v2());
        //                  static  OutputImpl.staticTest();
締め括りをつける
  • インターフェースのdefault(デフォルト)方法は、方法実現器
  • を提供することができる.
  • インターフェースの実装クラスは、default(デフォルト)方法
  • を実装しないことができる.
  • インターフェースの実装クラスは、default(デフォルト)方法
  • を実装することができる.
  • インターフェースの実装クラスの例は、default(デフォルト)方法
  • を直接使用することができる.
  • インターフェースのstatic(静的)方法は、インターフェースによって直接に起動することができます.インターフェースの実装クラスによって呼び出すことができません.
  • インターフェースのdefault(デフォルト)方法とstatic(静的)方法は、複数の
  • を定義することができる.
    インターフェースのdefault方法とstatic方法はfinalで修飾できません.
    staticメソッドがfinalで修飾できないということは分かりやすいです.staitc方法はインターフェースに属しています.書き換えられないです.default方法はfinalで修飾されません.個人的な理解はdefault方法です.本質的には「実現体がある」インターフェースの抽象的な方法です.すべての実現クラスにデフォルトの実現を提供します.このdefault方法は他の抽象的な方法と同じです.デザインされたものは、実現されたものとして書き換えられたいです.default方法がfinalによって修飾されると、この方法はインターフェースの実現されたすべての種類に書き換えられません.つまり、この方法は一つしか実現できないということです.static方法と同じではないですか?この方法を直接static方法として設計すればいいです.注:書き直しは多状態という概念を継承しているからこそできたものです.staticの修飾の対象は類そのものです.多状態を継承することとは関係がありません.
    参照
    Why is“final”not allowed in Java 8 interface methods?