インターフェースの扱い方
java.util.Listやjava.util.Mapのインターフェースを使用することは多いと思います
今回は、自作したインターフェースを使用してみようと思います。
==<今回のやりたいこと>===
自作したインターフェースを使用して、起動するクラスを切り替えて実行しようというものです。
具体的には、インターフェースCommandIFを作成し、以下の2つのクラスに実装、メインメソッドで標準入力を受けて入力した文字列によって2つのクラスのうちどちらを起動するか選択できるようにする。
- HelloCommand
- ReadyCommand
起動した時の動画です。
インターフェースサンプルを作る
-
まずはインターフェースクラスを作成します。
下のように、インターフェースを定義public interface CommandIF { }
-
インターフェースに、実装クラスで起動するメソッドを定義します。
ここで作成するメソッドは、実装(implements)したクラスで必ず定義しなくてはいけないメソッドになります。public interface CommandIF { /** コマンドを実行する */ public void execute(); }
完成したコードはGithubにあります。
-
インターフェースを実装する
今回は下のように2つのクラスに実装(implements)しました。
<メインメソッドで実行する>
public class Lv3_1_RefactorLv2_Main {
/** コマンドリスト */
private static Map<String, CommandIF> cmdMap;
public static void main(String[] args) {
// コマンドの用意
cmdMap = new HashMap<String, CommandIF>();
cmdMap.put("hello", new HelloCommand());
cmdMap.put("ready", new ReadyCommand());
// 標準入力
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("入力してください: ");
String inStr = input.nextLine();
if ("bye".equals(inStr)) {
System.out.println("Good Bye");
break;
}
CommandIF cmd = cmdMap.get(inStr);
if (cmd != null) {
cmd.execute();
} else {
System.out.println("コマンドが登録されていません。: " + inStr);
}
}
}
}
上のメインメソッドでは、以下のような処理を行っています。
- HashMapのインスタンスをMap型の変数に代入
- マップのキーに"hello"、値に「HelloCommand」クラスのインスタンス
- 同様にキーに"ready"、値に「ReaddyCommand」クラスのインスタンス
- 無限ループを開始
- 入力を促し、標準入力を受ける
- マップから「HelloCommand」か「ReaddyCommand」もしくはnullを取得する(キーに該当するものがないときはNULLが返ってくる)
- 「HelloCommand」か「ReaddyCommand」のexecute()メソッドを実行
「HelloCommand」と「ReaddyCommand」クラスには「CommandIF」をimplementsしていますので必ず「execute()」メソッドが存在し、実行することができます。
このように、インターフェースを実装したクラスはそのインターフェース型として使用することができますので、CommandIFを実装(implements)したクラスは全て「execute()」メソッドがあり、CommandIF型の変数に代入、execute()を実行できるというわけです。
余談ですが、このインsターフェースを実装した他のサンプルもありますので、これも紹介します(動画ですが。。。)。
<応用編>
今回はそんなところで。。。
でわでわ。。。
関連記事
関連ページ一覧
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
Java Basic一覧
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Git関連
- Java Git clone in Eclipse 〜サンプルの取得〜
- Eclipse Gitリポジトリの取得 〜GitからソースをPullしよう〜
- IntelliJ IDEA Git〜Gitリポジトリからクローン〜
JavaFX関連ページ
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
- JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
- Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜
ステップアップ関連ページ一覧
- Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
- ステップアッププログラミング〜Java FxでHelloWorld解説〜
- Java StepUpPrograming〜JavaFX で四則計算〜
- Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
- Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
- Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
- Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
- Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine
JavaFX + ND4Jで機械学習準備
- JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
- JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
- Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜
オブジェクト指向関連ページ
- [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
- オブジェクト指向の概念2〜クラスとは〜