blog

java8の新機能を持つインターフェースのデフォルト・メソッド

JAVA8が登場して久しいですが、java8がjava5以来最も重要なリリースであることは間違いありません。言語、コンパイラ、ライブラリ、ツール、JVMなどに新機能が含まれています。Java8の新機能...

Dec 13, 2020 · 4 min. read
シェア

Java8 インターフェース・デフォルト・メソッドの新機能

Java8がリリースされて久しいですが、間違いなくjava5以来最も重要なリリースです。言語、コンパイラ、ライブラリ、ツール、JVMなどの新機能が含まれています:

  • インターフェース・デフォルト・メソッド
  • 機能インターフェイス
  • Lambda
  • メソッド参照
  • Stream
  • Optional
  • Date API
  • Base64
  • 重複注釈とタイプ注釈の比較

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

、インターフェイスのデフォルト・メソッドは何ですか

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

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

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

デフォルト方式

jdk8 では、インターフェースにデフォルト修飾子を必要とする実装メソッドを含めることができます。このようなメソッドはデフォルトメソッドと呼ばれます。デフォルトメソッドはインターフェイスで実装する必要があり、実装クラスで必要に応じてオーバーライドすることができます。デフォルト・メソッドは、実装クラス内または実装クラス・オブジェクトを通してのみ呼び出すことができます。注意: 同じデフォルト・メソッドが複数の親インターフェースに存在する場合、そのメソッドはサブクラスに近接して継承されます。

public interface IMathOperation {
 /**
 * インタフェースのデフォルト・メソッドの定義 メソッドの形式パラメータのサポート
 */
	default void print(){
 	System.out.println("これは数値演算の基本インターフェースである。");
 	}
}

静的メソッド

静的メソッドは static で修飾されるメソッドです。インターフェイスの Static Methods ページも実装しなければなりません。

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

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

  • IMathOperation インターフェースを定義し、デフォルトの print メソッドを提供します。
public interface IMathOperation {
 /**
 * インタフェースのデフォルト・メソッドの定義 メソッドの形式パラメータのサポート
 */
 	default void print(){
 	System.out.println("これは数値演算の基本インターフェースである。");
 	}
 
 /**
 * 静的デフォルト・メソッドを定義する
 */
 	static void version(){
 System.out.println(" 1.0シンプルな計算機");
 	}
 /**
 * 整数の加算メソッド
 * @param a
 * @param b
 * @return
 */
 	public int add(int a,int b);
}
  • サブクラスの実装

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

ここでは、IMathOperation インターフェースを実装する際に、インターフェースのデフォルト・メソッドを実装することを選択できることがわかります。

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

最も完全な学習教材 →サテライト:lezijie700

複数のデフォルト・メソッド・シナリオ

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

1.クラス内のメソッドが最優先されます。

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

3.それでも判別できない場合、複数のインターフェイスを継承するクラスは、オーバーライドと期待されるメソッドへの呼び出しを表示することによって、デフォルトメソッドのどの実装を使用するかを選択する必要があります。

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

/**
* 携帯電話のインターフェースを定義する デフォルトの情報メソッドを提供する
*/
public interface Phone {
 default void info(){
 System.out.println("これは携帯電話");
 	}
}
/**
* MiPhoneサブインターフェースを定義し、Phone親インターフェースから継承し、infoメソッドも提供する。
*/
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();
 	}
}
結果を印刷する: 
これはシャオミの携帯電話だ

jdk8がリリースされて久しいですが、間違いなくjava8はjava5以降で最も重要なリリースです。言語、コンパイラ、ライブラリ、ツール、JVMなどに新機能が盛り込まれています。

Read next

TiDB 4.0では、ホットスポットに対処するためにどのような改善がなされたのか?

TiDBのデータアクセスホットスポット問題は、常にユーザーの大きな関心事でした。なぜこのような問題が目立つのでしょうか?これは実は「分散型」の構造的な影響です。分散データベースクラスタは、ストレージの拡張、読み取りおよび書き込み容量の拡張の目的を達成するために、複数のノードがある間、スタンドアロンデータベースは、唯一のノードがあるため、ホットスポットの問題はありませんが、私は...

Dec 13, 2020 · 8 min read