blog

LeByte - Java8コア実践1:インターフェースのデフォルトメソッド

コア機能の概要\n\nインターフェースのデフォルトメソッド\n\nウェブサイトに登録するときは、登録後にウェブサイトが提供するデフォルトのアバターを使用します。デフォルトのアイコンは、通常、アプリケー...

Nov 5, 2020 · 7 min. read
シェア

コア機能の概要

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

ウェブサイトに登録するときは、登録後にウェブサイトが提供するデフォルトのアバターを使用します。アプリケーションのインストールに成功すると、デフォルトのアイコンが提供されるのが一般的です。Java8は、インターフェイスの元の機能を拡張し、デフォルトメソッドのサポートを提供します。

概念

Java8からは、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);
}
  • サブクラスの実装

MathOperationImpl サブクラスの定義 IMathOperation インターフェースの実装

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

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

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

アプリケーションを開発するJava8を使用して、サブクラスは、複数のインターフェイスを実装するために、インターフェイスのデフォルトメソッドの定義では、複数のデフォルトメソッドの定義を許可し、インターフェイスのデフォルトメソッドは、同じ名前で表示されることがあります実装または呼び出しのサブクラスのためのこの時間は、通常、次の原則に従ってください。

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

2.前者が判断できない場合は、サブインターフェイスの優先順位が高くなります。関数シグネチャが同じ場合は、デフォルトメソッドの実装が最も具体的なインターフェイスが優先されます。

サンプルコードは以下の通りです。

/**
* 携帯電話のインターフェイスは、デフォルトの情報メソッドを提供するために定義する
*/
public interface Phone {
 default void info(){
 System.out.println("これは携帯電話である」)。;
 }
}
/**
* MiPhoneのサブインターフェイスを定義し、Phoneの親インターフェイスを継承し、また、情報メソッドを提供する。
*/
public interface MiPhone extends Phone{
 default void info(){
 System.out.println("これはシャオミの携帯電話だ」)。;
 }
}
/**
* Phone Phoneインターフェイスを実装する
*/
public class M2sPhone implements Phone,MiPhone {
 public static void main(String[] args) {
 new M2sPhone().info();
 }
}
結果を印刷する:
これはシャオミの携帯電話である

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

Java8では、インターフェイスに複数のデフォルト・メソッドを定義できることに加えて、インターフェイスに複数の静的メソッドを定義することもできます。インターフェイス内の静的メソッドは実装も提供する必要があり、インターフェイスを通してメソッドを直接呼び出す方法を提供します。

public interface IMathOperation {
 /**
 * インターフェイスのデフォルトメソッドを定義する メソッドの形式パラメータをサポートする
 */
 default void print(){
 System.out.println("これは数値演算の基本的なインターフェイスである");
 }
 
 /**
 * 静的デフォルトメソッドを定義する
 */
 static void version(){
 System.out.println(" .0シンプルな電卓のバージョン");
 } 
}

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

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

、サイトアクティブTOP3ユーザートラバース

ここでは、例えば、ブログサイトの例では、毎月サイトの上位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","126@126.com",260,"lv2"));
  • 実装のための強化

統計収集データを取得した後、それを実装する最も簡単な方法は、java8でも一般的に使用されているaugmented forを使用することです。

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);
  • 拡張 Iterable インターフェース・デフォルト・メソッドの使用

System.out.println("----------反復を設定する>インタフェースのデフォルトメソッドをリストアップする ---------");
uList.forEach(new Consumer<UserDto>() {
@Override
public void accept(UserDto userDto) {
System.out.println(userDto);
}
});
}

、サイトアクティブ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の助けを借りて、要素のコレクションのソート操作を達成するために、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);

新しいJavaの情報は、衛星lezijie007コード13を入力して追加すると、受信することができます。

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

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

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

2.サブクラスはインターフェイスメソッドをより柔軟に実装できます。

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

3、多数のツールの作成を避けるための開発

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

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

ラムダは、インターフェイスの1つの抽象的なメソッドだけで、インターフェイスは、インターフェイスのデフォルトメソッドと静的メソッドを紹介し、ドッキングインターフェイスでこれらのメソッドを呼び出すには、ラムダ式を導入することができますコードを書くの元のフォームを簡素化し、コードがより簡潔になります。

Read next

日々の学習 - ソースコードの呼び出し

MDN での説明: 指定された this の値と、個別に与えられた 1 つ以上の引数で関数を呼び出します。 警告:非厳密モードでは、nullまたはundefinedを指すthisは自動的にグローバルオブジェクトとして指定され、元の値はラップされます。 毎日、ソースコード解析を更新していきますが、フロントエンドの道がすべてうまくいっていることを願っています。

Nov 5, 2020 · 2 min read