blog

Java8では、実戦のインターフェース・デフォルト・メソッドの場所を知らないかもしれない。

I. コア機能の概要\n\nインターフェース・デフォルト・メソッド\n\nウェブサイトへの登録時には、登録後にウェブサイトから提供されるデフォルトのアバターを使用し、デフォルトのアイコンは通常、アプリ...

Jun 14, 2020 · 10 min. read
シェア

I. コア機能の概要

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

Webサイトに登録するときは、登録後にWebサイトが提供するデフォルトのアバターを使用し、デフォルトのアイコンは、アプリケーションのインストールに成功した後に提供されるのが普通であり、電子商取引のWebサイトから購入した商品の代金を支払うときは、デフォルトの住所を一般的に使用されている配送先住所として設定し、生活の中で多くのシナリオでデフォルトになっているようです。Java8が開始され、この単語のデフォルトもあり、ここではインターフェイスのJava8は、インターフェイスの元の機能を拡張します。Java8は、インターフェイスの元の機能を拡張し、デフォルトメソッドのサポートを提供します。

概念

Java 8以降、プログラムには、デフォルト・メソッドであるdefault修飾子を持つインターフェースに実装固有のメソッドを含めることが許可されています。1つのインターフェースには複数のデフォルト・メソッドを追加することができ、Java8ではインターフェースに対応するデフォルト・メソッドが多数用意されています。

構文

Java 8 のインターフェースには、default 修飾子を必要とする実装メソッドを含めることができます。このようなメソッドはデフォルト・メソッドと呼ばれます。デフォルト・メソッドはインターフェイスで実装する必要があり、実装クラスで必要に応じてオーバーライドできます。デフォルト・メソッドは、実装クラス内または実装クラス・オブジェクトを通じてのみ呼び出すことができます。次のような形式です:

public interface IMathOperation {
   /**
    * 定义接口默认方法 支持方法形参
    */
   default void print(){
       System.out.println("数値演算 基本インターフェース・デフォルトの印刷メソッド。");
  }
}

使い方は簡単

  • 「インターフェース定義

IMathOperation インターフェースを定義し、デフォルトの print メソッドを提供します。

public interface IMathOperation {
   /**
    * 定义接口默认方法 支持方法形参
    */
   default void print(){
       System.out.println("これが数値演算の基本インターフェースである。");
  }
   /**
    * 整数の加算メソッド
    * @param a
    * @param b
    * @return
    */
   public int add(int a,int b);
}
  • "サブクラスの実装"

IMathOperation インターフェースを実装する MathOperationImpl サブクラスを定義します。

サブクラスは、実装時に必要に応じてインターフェースのデフォルトメソッドをオーバーライドします。

public class MathOperationImpl implements  IMathOperation {
   @Override
   public int add(int a, int b) {
       // サブクラスは、親インターフェイスのデフォルト・メソッドを直接呼び出すことができる。
       IMathOperation.super.print();
       // 親クラスの静的デフォルトメソッドを呼び出す
       IMathOperation.version();
       return a+b;
  }
}

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

Java8を使用してアプリケーションを開発する場合、サブクラスは複数のインタフェースを実装し、インタフェースのデフォルト・メソッド定義では複数のデフォルト・メソッドを定義することができ、インタフェースのデフォルト・メソッドは同じ名前を持つ可能性があるため、サブクラスは通常、実装または呼び出す際に以下の原則に従います:

1.クラス内のメソッドが最優先

2.最初の判断ができない場合、サブインターフェイスの優先順位が高くなります。関数のシグネチャが同じ場合、デフォルトメソッドの実装が最も具体的なインターフェイスが優先されます。つまり、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();
  }
}
結果を印刷する:
これはシャオミの携帯電話だ

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

Java8では、インターフェイスに複数のデフォルト・メソッドを定義できることに加えて、インターフェイスに複数のスタティック・メソッドを定義することもできます。インターフェイス内の静的メソッドは実装も提供しなければならず、インターフェイスを通してメソッドを直接呼び出す方法を提供します。

public interface IMathOperation {
   /**
    * 定义接口默认方法 支持方法形参
    */
   default void print(){
       System.out.println("これが数値演算の基本インターフェースである。");
  }
   
    /**
    * 静的デフォルト・メソッドを定義する
    */
   static void version(){
       System.out.println(" 1.0シンプルな計算機");
  }    
}

インターフェイスの静的メソッドは、インターフェイス自身を通してのみ呼び出すことができ、クラスの静的メソッドと同様に、デフォルトメソッドの多重継承の問題はありません。

IV.インターフェース・デフォルト手法の実際

4.1 ウェブサイトのトップ3アクティブユーザーのトラバース

ここでは、例えば、ブログサイトの例では、毎月サイトの上位3つのアクティブユーザーをカウントし、インターフェイスのデフォルトのメソッドを使用するには、コレクションのトラバーサル操作を使用して、テストデータは次のとおりです。

uList=  new ArrayList<>();
uList.add(new UserDto(35,"zs","126xxx@126.com",800,"lv4"));
uList.add(new UserDto(60,"js_li","157xxx@139.com",500,"lv3"));
uList.add(new UserDto(78,"fc_007",".com",260,"lv2"));
  • "実現のための強化"

統計コレクションを取得した後、最も簡単な方法は、java8でも一般的に使用されているenhanced for implementationを使用することです。

System.out.println("----------反復を設定する-->オリジナルのトラバーサル・メソッド---------");
for(UserDto u:uList){
 System.out.println(u);
}
  • "カスタムインターフェースのデフォルトメソッド"
/**
* @Version 1.0
* 定义MyList 接口 并提供myForeach 默认方法
*/
public interface MyList<T> {
   /**
    * インターフェースのデフォルトメソッドを定義する
    * @param t
    */
  default public  void myForeach(List<T> t){
      for(Object o:t){
          System.out.println(o);
      }
  }
}
/**
* @Version 1.0
* 定义MyArrayList 子类 实现MyList 接口,继承ArrayList
*/
public class MyArrayList<T> extends ArrayList<T> implements MyList<T> {
   
}
/**
 トラバーサルを実行する
*/
System.out.println("----------反復を設定する-->インターフェースのデフォルトメソッドをカスタマイズする---------");
// カスタムインターフェースのデフォルトメソッドを使ってコレクション要素を反復処理する
uList.myForeach(uList);
  • "拡張されたイテレート可能インターフェースのデフォルトメソッドの使用"
System.out.println("----------反復を設定する-->リスト・インターフェースのデフォルト・メソッドの強化---------");
uList.forEach(new Consumer<UserDto>() {
        @Override
        public void accept(UserDto userDto) {
            System.out.println(userDto);
        }
 });
}

4.2.アクティブTOP3ユーザーの振り分け

ここでは、例としてブログサイトに、そのような統計として毎月サイトのトップ3のアクティブユーザーは、テストデータのインターフェイスのデフォルトのメソッドを使用するソート操作のコレクションを使用して、次のとおりです:

  • "Collections.sortユーティリティクラスは、ソートを実装するためのメソッドです。
System.out.println("--------Collections.sort 論文を出版巻数でソートする---------");
       Collections.sort(uList, new Comparator<UserDto>() {
           @Override
           public int compare(UserDto o1, UserDto o2) {
               return o1.getTotal()-o2.getTotal();
          }
      });
uList.forEach(System.out::println);
  • 「リストインターフェイスのデフォルトソートメソッドを強化しました。

Java8の拡張リスト・インターフェースによるコレクションの並べ替え デフォルトの並べ替えメソッド

System.out.println("--------コレクション用のデフォルトソートメソッドで、記事を出版点数順にソートする---------");
       uList.sort(new Comparator<UserDto>() {
           @Override
           public int compare(UserDto o1, UserDto o2) {
               return o1.getTotal()-o2.getTotal();
          }
      });
uList.forEach(System.out::println);
  • "ストリーム・ソート・メソッド"

Streamは、コレクションの様々な操作を提供し、ここではStreamのソートの助けを借りて、コレクション要素のソート操作を実現するために、Streamの詳細な紹介が続きます。

System.out.println("--------Stream論文を出版ボリュームでソートする---------");
      List<UserDto> result= uList.stream().sorted(new Comparator<UserDto>() {
           @Override
           public int compare(UserDto o1, UserDto o2) {
               return o1.getTotal()-o2.getTotal();
          }
      }).collect(Collectors.toList());
result.forEach(System.out::println);

V. インタフェース・デフォルト・メソッドとスタティック・メソッドの利点

"1.インターフェイスの互換性解決"

インターフェイスプログラミングを使用する利点は、開発が抽象的な、もはや具体的指向のプログラミングに向いているということです、プログラムは非常に柔軟になること、欠陥は、インターフェイスを変更する必要がある場合、インターフェイスのクラスの対応する実装は、その全体を変更する必要があるということです、例えば、フレームワークの一般的に使用されるセットのJava 8はforeachメソッドを持っていない、解決策は通常、インターフェイスとその実装に関連するJDKに新しいインターフェイスを追加することです考えることができます。メソッドと実装をJDKの関連するインターフェイスに追加します。Java 8から、インターフェイスのデフォルトメソッドの導入は、この利点も非常に明白である、すべての最初のJava 8の前のバージョンのインターフェイスの互換性の問題を解決するために、同時にプログラムの将来の発展のために、直接インターフェイスのサブクラスでインターフェイスのデフォルトメソッドを使用することができます、もはやサブクラスは、インターフェイスメソッドに独自の応答を実装する必要があります。

"2.サブクラスはインターフェイスメソッドの実装においてより柔軟性があります。"

インタフェースのデフォルトメソッドは、サブクラスで直接呼び出すことができますが、サブクラスは、オンデマンドでインタフェースを書き換えることができ、もはやJava8に以前のインターフェイスメソッドは、完全に実装する必要があります柔軟性の程度は比較的高いです。

"3.開発における多数のツールの作成を避けること

ツールの多数の元のプロジェクトの開発のためのインターフェイスの静的メソッドの導入は、コードの静的メソッドの数が多いインターフェイスの定義と実装に移行することができます表示され、ツールの数を作成する必要がなくなります。

"4.ラムダ式のサポートの改善".

Lambdaは、抽象メソッドを1つしか持たないインターフェースのためのもので、インターフェースのデフォルトメソッドやスタティックメソッドを導入します。 インターフェース上でこれらのメソッドを呼び出す際に、Lambda式を導入することで、本来のコードの記述形式を簡略化し、より簡潔にすることができます。

Read next

回帰分析におけるR2乗と修正R2乗の違い

概要\nR2乗と調整R2乗の概念の理解\nR2乗と調整R2乗の主な違いを理解します。\nプレゼンテーション\n\n線形回帰の概念とアルゴリズムがどのように機能するかを理解した後、私はそれを使って問題文で予測を行うことにとても興奮しました。皆さんの多くも同じでしょう。しかし、一度

Jun 14, 2020 · 6 min read