楽バイト-Java 8コアプロパティ-インタフェースのデフォルト方法

9534 ワード

JAVA 8は長い間リリースされており、java 5(2004年リリース)以降のOracleリリースの最も重要なバージョンです.言語、コンパイラ、ライブラリ、ツール、JVMなど多くの新しい特性が含まれており、国内外のインターネット会社にとってJava 8は今後の技術開発のトレンドである.ここでは主に開発におけるいくつかのコアの新しい特性を説明する.(主に新しい特性概念の解釈、文法の定義、簡単なコードのプレゼンテーション、優劣の分析、プロジェクトの実戦のいくつかの方面から書きます).

一、コア特性一覧


二、インタフェースのデフォルト方法


ウェブサイトを登録する時、私達は登録した後にウェブサイトの提供するデフォルトの顔を使って、アプリケーションのインストールが成功した後に通常デフォルトのアイコンを提供して、電子商取引のウェブサイトが商品を購入して支払いを行ったことがある時、私達は常用の出荷先の住所をデフォルトの住所に設定して、生活の中で多くのシーンがデフォルトの説があるように見えます.Java 8からは、同様にデフォルトという言葉も登場し、ここではインタフェースJava 8に対してインタフェースの元の機能を拡張し、デフォルトの方法をサポートしています.

コンセプト


Java 8から、プログラムはインタフェースに具体的な実装方法を含め、default修飾を使用することを許可し、このような方法がデフォルトの方法である.デフォルトメソッドはインタフェースに複数追加でき、Java 8は対応するインタフェースのデフォルトメソッドを多く提供します.

構文


Java 8のインタフェースには、デフォルトメソッドと呼ばれるdefault修飾を使用する必要がある実装メソッドが含まれます.デフォルトのメソッドは、インタフェースに実装を提供する必要があります.実装クラスでは、必要に応じて書き換えることができます.デフォルトのメソッドは、インプリメンテーションクラスまたはインプリメンテーションクラスオブジェクトからのみ呼び出されます.次のようになります.
public interface IMathOperation {
    /**
     *                
     */
    default void print(){
        System.out.println("              。。。");
    }
}

単純な使用

  • インタフェース定義IMathOperationインタフェースを定義し、デフォルト印刷方法
  • を提供する.
    public interface IMathOperation {
        /**
         *                
         */
        default void print(){
            System.out.println("          。。。");
        }
        /**
         *         
         * @param a
         * @param b
         * @return
         */
        public int add(int a,int b);
    }
  • サブクラス実装定義MathOperationImplサブクラス実装IMathOperationインタフェース
  • サブクラス実装時にインタフェースのデフォルトメソッドをオンデマンドで書き換える
    public class MathOperationImpl implements  IMathOperation {
        @Override
        public int add(int a, int b) {
            //                  
            IMathOperation.super.print();
            //           
            IMathOperation.version();
            return a+b;
        }
    }

    複数のデフォルトメソッド


    Java 8を使用してアプリケーションを開発し、サブクラスが複数のインタフェースを実装する場合、インタフェースのデフォルト・メソッド定義では複数のデフォルト・メソッドを定義できます.インタフェースのデフォルト・メソッドでは、サブクラスが実装または呼び出し時に通常次の原則に従います.
    1.クラスのメソッドの優先度が最も高い
    2.第1の判断ができない場合、サブインタフェースの優先度はより高い:関数署名とともに、最も具体的な実装のデフォルトメソッドを持つインタフェースを優先的に選択する.すなわち、BがAを継承している場合、BはAよりも具体的である
    サンプルコードは次のとおりです.
    /**
     *             info  
     */
    public interface Phone {
        default void info(){
            System.out.println("      ");
        }
    }
    ​
    /**
     *   MiPhone        Phone          info  
     */
    public interface MiPhone extends Phone{
        default void info(){
            System.out.println("        ");
        }
    }
    ​
    /**
     *    Phone MiPhone   
     */
    public class M2sPhone implements Phone,MiPhone {
    ​
        public static void main(String[] args) {
            new M2sPhone().info();
        }
    }
    ​
        : 
            

    三、インタフェースの静的方法


    インタフェースでは、複数のデフォルトメソッドの定義に加えて、Java 8は、staticによって修飾された複数の静的メソッド、すなわち、インタフェースで複数の静的メソッドを定義することも可能である.インタフェース内の静的メソッドも実装を提供しなければならず、インタフェースを直接介してメソッドを呼び出すことができる方法を提供する.
    public interface IMathOperation {
        /**
         *                
         */
        default void print(){
            System.out.println("          。。。");
        }
        
         /**
         *         
         */
        static void version(){
            System.out.println("  1.0      ");
        }    
    }

    インタフェース内の静的メソッドはインタフェース自体でしか呼び出せません.Classの静的メソッドと同様に、デフォルトメソッドでのマルチ継承の問題はありません.静的メソッドは実装クラスで上書きすることはできません.実装クラスでは同じメソッドを宣言できますが、この2つのメソッドの間には名前が同じ以外にOverride関係はありません.

    四、インタフェースのデフォルト方法の実戦


    サイトアクティブTOP 3ユーザー遍歴


    ここでは、ブログのWebサイトの例として、毎月のWebサイトの上位3位のアクティブなユーザー(ユーザー記事の発表量による評価)を統計し、インタフェースのデフォルトメソッドを使用するためにコレクションループ操作を使用します.テストデータについては、次のようにします.
    uList=  new ArrayList<>();
    uList.add(new UserDto(35,"zs","[email protected]",800,"lv4"));
    uList.add(new UserDto(60,"js_li","[email protected]",500,"lv3"));
    uList.add(new UserDto(78,"fc_007","[email protected]",260,"lv2"));
  • 強化for
  • を実現
    統計集合データを得た後,最も簡単な方法は増強forを用いて実現され,java 8以前によく用いられた方法でもある.
    System.out.println("----------    -->      ---------");
    for(UserDto u:uList){
        System.out.println(u);
    }
  • カスタムインタフェースのデフォルト方法
  • /**
     * @Version 1.0
     *   MyList       myForeach     
     */
    public interface MyList {
        /**
         *         
         * @param t
         */
       default public  void myForeach(List t){
           for(Object o:t){
               System.out.println(o);
           }
       }
    }
    ​
    /**
     * @Version 1.0
     *   MyArrayList       MyList   ,  ArrayList
     */
    public class MyArrayList extends ArrayList implements   MyList {
        
    }
    ​
    /**
          
    */
    System.out.println("----------    -->         ---------");
    //                     
    uList.myForeach(uList);
  • 拡張Iterableインタフェースのデフォルトメソッド
  • を使用
    System.out.println("----------    -->   List      ---------");
    uList.forEach(new Consumer() {
    @Override
    public void accept(UserDto userDto) {
        System.out.println(userDto);
            }
        });
    }   

    サイトアクティブTOP 3ユーザーランキング


    ここでは、ブログのWebサイトの例として、毎月のWebサイトの上位3位のアクティブなユーザー(ユーザー記事の発表量による評価)を統計し、集合ソート操作を使用してインタフェースのデフォルトメソッドを使用します.テストデータは次のようになります.
  • Collections.sortツールクラスメソッド実装ソート
  • System.out.println("--------Collections.sort           ---------");
            Collections.sort(uList, new Comparator() {
                @Override
                public int compare(UserDto o1, UserDto o2) {
                    return o1.getTotal()-o2.getTotal();
                }
            });
    uList.forEach(System.out::println);
  • 拡張ListインタフェースデフォルトsortメソッドJava 8拡張ListインタフェースデフォルトSortメソッドにより集合ソート動作
  • を実現する.
    System.out.println("--------    sort            ---------");
            uList.sort(new Comparator() {
                @Override
                public int compare(UserDto o1, UserDto o2) {
                    return o1.getTotal()-o2.getTotal();
                }
            });
    uList.forEach(System.out::println);
  • Streamストリームsortedメソッド実装ソート(ここではまず理解!)Streamストリームには、集合に関するさまざまな操作があります.ここでは、Streamのsortedを使用して集合要素のソート操作を実現します.その後、Streamについて詳しく説明します.
  • System.out.println("--------Stream          ---------");
           List result= uList.stream().sorted(new Comparator() {
                @Override
                public int compare(UserDto o1, UserDto o2) {
                    return o1.getTotal()-o2.getTotal();
                }
            }).collect(Collectors.toList());
    result.forEach(System.out::println);

    五、インタフェースのデフォルト方法と静的方法の優位性

  • インタフェースの互換性が解決されるインタフェースプログラミングを使用する利点は、開発が抽象的で具体的なプログラミングではなく、プログラムを柔軟にすることである.欠陥は、インタフェースを修正する必要がある場合、そのインタフェースを実現するクラスに対してすべての修正が必要であることである.例えば、java 8は以前、私たちがよく使っていた集合フレームワークに対してforeach方法がなかった.一般的に考えられる解決策は,JDKに関連するインタフェースに新しい方法と実装を追加することである.Java 8からインタフェースのデフォルトメソッドが導入されたことも明らかで、まずJava 8の以前のバージョンのインタフェース互換性の問題を解決し、同時に私たちの今後のプログラム開発に対しても、インタフェースのサブクラスでインタフェースのデフォルトメソッドを直接使用することができ、各サブクラスでそれぞれ応答インタフェースメソッドを実現する必要はありません.
  • サブクラスインタフェースメソッドを実装する場合、より柔軟性の高いサブクラスインタフェースを実装する場合、必要に応じて書き換えることができ、Java 8に向かう前にインタフェースメソッドがすべて実装されなければならないと同時に、インタフェースのデフォルトメソッドはサブクラスで直接呼び出すことができ、柔軟性が高い.
  • 開発では、大量のツールクラス作成インタフェースに静的メソッドを導入することを避け、既存のプロジェクト開発で大量のツールクラス大量の静的メソッドが発生したコードをインタフェースに移行して定義と実現することができ、大量のツールクラスの作成を省くことができる.
  • Lambda式のサポートLambdaは、1つの抽象的な方法しかないインタフェースに対して、インタフェースにインタフェースのデフォルト方法と静的方法を導入し、インタフェースのこれらの方法を呼び出すと、Lambda式を導入して既存のコードの書き方を簡略化することができ、コードをより簡潔にすることができます.

  • Java 8コアプロパティ-インタフェースのデフォルト方法はここまでです.次回はJava 8について説明します.楽バイトWXの公衆番号に注目して、より多くのJava技術の共有を得てください.
    楽バイトオリジナル、転載は出典と作者を明記してください.
    転載先:https://juejin.im/post/5cf0e30051882549657ce0f2