インターフェースのデフォルトと静的メソッド
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/87。
元々、インターフェースには実装のない abstract メソッドしか含めることができませんでした。Java 8 以降、インターフェースにはデフォルトメソッドと静的メソッドを含める機能が追加され、より柔軟になりました。
default method は、default キーワードを使用して、interface 内に直接実装を提供します。interface を Implement する class は、この behavior を自動的に継承しますが、needed に応じて override できます。
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}Drawable を実装する class は、display() method を無料で取得します。これは、すでに実装しているクラスを壊すことなく既存のインターフェースに新しいメソッドを追加する場合に特に便利です。
インターフェースの静的メソッドは、クラスの静的メソッドと同じように機能します。これらはinterface自体に属し、interface名を使用して呼び出されます。
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
}
// 使用例
int result = MathOperations.add(5, 3);静的インターフェースメソッドはオーバーライドできず、実装クラスに継承されません。インターフェースの目的に関連するユーティリティメソッドに便利です。
class が 2 つの interface に同じ default method signature で implements している場合、競合を解決するために、class はその method を override する必要があります。
チャレンジ
簡単デフォルトメソッドとインターフェースの静的メソッドの両方を紹介するメッセージングシステムを構築しましょう。実装するクラスが直接使用したり、必要に応じてカスタマイズしたりできる組み込み機能を備えたインターフェースを作成します。
コードを4つのファイルに分けて整理します。
Messenger.java: あらゆるメッセージングサービスを表すインターフェースをDefineします。voidを返すabstract methodsendMessage(String message)をDeclareする必要があります。sendWithTimestamp(String message)というdefault methodをAddし、[TIMESTAMP]を出力した後、sendMessage(message)をCallします。さらに、formatMessage(String message)というstatic methodも含めます。このmethodはmessageを大文字にconvertedしたものを返します。EmailMessenger.java:MessengerをimplementsするclassをCreateします。recipientというfield(String)があります。recipientを初期化するconstructorを含めます。sendMessage()をImplementして、Email to [recipient]: [message]を出力します。このclassはdefaultのsendWithTimestamp()methodをそのまま使用します。SMSMessenger.java:Messengerをimplementsするanother classをCreateします。phoneNumberというfield(String)があります。電話番号を初期化するconstructorを含めます。sendMessage()をImplementして、SMS to [phoneNumber]: [message]を出力します。defaultのsendWithTimestamp()methodをOverrideし、defaultのタイムスタンプのbehaviorを使用する代わりに、[URGENT]を出力した後、sendMessage(message)をCallします。Main.java: defaultとstaticのインターフェースmethodの両方を実演するために、すべてをまとめます。3つのinputs、つまりemailのrecipient、電話番号、messageを受け取ります。まず、static methodMessenger.formatMessage()を使用してmessageをformatし、保存します。次に、EmailMessengerとSMSMessengerをCreateします。それぞれのmessengerについて、formatted messageを使ってsendWithTimestamp()をCallします。EmailMessengerがdefault implementationを使用し、SMSMessengerがoverrideされたversionを使用することに注目してください。
3つのinputs、つまりemailのrecipient(String)、電話番号(String)、message(String)を受け取ります。
出力は合計4行にしてください。各messengerにつき2行で、prefix行([TIMESTAMP]または[URGENT])の後にmessage行を表示します。EmailMessengerにはdefaultのタイムスタンプprefixが表示され、SMSMessengerにはcustomの緊急prefixが表示されます。どちらもstaticにformatされた(uppercaseの)messageを使用します。
必須の出力形式:
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み取る
String emailRecipient = scanner.nextLine();
String phoneNumber = scanner.nextLine();
String message = scanner.nextLine();
// TODO: Messenger.formatMessage() を使ってメッセージをフォーマットし、保存する
// TODO: メール受信者で EmailMessenger を作成する
// TODO: 電話番号で SMSMessenger を作成する
// TODO: フォーマット済みメッセージで EmailMessenger の sendWithTimestamp() を呼び出す
// TODO: フォーマット済みメッセージで SMSMessenger の sendWithTimestamp() を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム自分で練習してみよう: Javaオンラインコンパイラ