#楽バイト-Java 8コア実戦の1つ:インタフェースのデフォルト方法


楽バイト-Java 8コア実戦の1つ:インタフェースのデフォルト方法


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();
      }
    }
    
        :
            

    インタフェース静的メソッド


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

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

    インタフェースデフォルトメソッド実戦


    1、ウェブサイトの活躍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);
    }
    });
    }

    2、サイトのアクティブ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);

    インタフェースのデフォルトメソッドと静的メソッドの利点


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