アプリ開発サークルJava講座② 開催日時 2020年11月21日(土) 20:00-21:00
開発アプリサークル Java講座② 2020-11-21(土)
今回はinterfaceについて
interfaceを英訳すると・・・接点、接続、等
interfaceに書かれたメソッドは中身がない状態です。
classに対して実装を行い、interfaceに書かれた中身のないメソッドをclassの中で記述し、何をするかを決めることで役割を果たします。
イメージとしては機能(class)に部品(interface)を追加していく。
まずは3つのinterfaceを作ります。
検索用のinterface
// 検索 public interface Find { String FindOne(); List<String> FindAll(); }
更新用のinterface
// 更新 public interface Update { List<String> UpdateOne(String TtelephoneNumber); List<String> UpdateAll(List<String> telephoneNumberList); }
削除用のinterface
// 削除 public interface Delete { List<String> DeleteOne(); List<String> DeleteAll(); }
上記のinterfaceにはまだどんな動作をするかを実装していないため、単体では使うことができません。 2つのクラスを作成し、先ほど作った3つのinterfaceを実装していきます。
TelephoneNumberクラス
public class TelephoneNumber implements Find, Update, Delete{ private List<String> telephoneNumberList = new ArrayList<String>() { { add("00011232345"); add("00023241234"); add("00021341413"); } }; // 一件検索 @Override public String FindOne() { return this.telephoneNumberList.get(0); } // 全件検索 @Override public List<String> FindAll() { return this.telephoneNumberList; } // 一件削除 @Override public List<String> DeleteOne() { this.telephoneNumberList.remove(0); return telephoneNumberList; } // 全件削除 @Override public List<String> DeleteAll() { this.telephoneNumberList.clear(); return telephoneNumberList; } // 一件更新 @Override public List<String> UpdateOne(String telephoneNumber) { telephoneNumberList.set(0, telephoneNumber); return telephoneNumberList; } // 全件更新 @Override public List<String> UpdateAll(List<String> telephoneNumberList) { this.telephoneNumberList = telephoneNumberList; return this.telephoneNumberList; } }
Placeクラス
public class Place implements Find, Update, Delete{ private List<String> placeList = new ArrayList<String>() { { add("兵庫"); add("大阪"); add("京都"); } }; // 一件検索 @Override public String FindOne() { return this.placeList.get(0); } // 全件検索 @Override public List<String> FindAll() { return this.placeList; } // 一件削除 @Override public List<String> DeleteOne() { placeList.remove(0); return placeList; } // 全件削除 @Override public List<String> DeleteAll() { placeList.clear(); return placeList; } // 一件更新 @Override public List<String> UpdateOne(String place) { placeList.set(0, place); return placeList; } // 全件更新 @Override public List<String> UpdateAll(List<String> placeList) { this.placeList = placeList; return this.placeList; } }
実行してみます。
public class Main { public static void main(String[] args) { TelephoneNumber telephoneNumber = new TelephoneNumber(); Place place = new Place(); // 検索 System.out.println("一件検索" + ":" + telephoneNumber.FindOne()); System.out.println("全件検索" + ":" + telephoneNumber.FindAll()); System.out.println("一件検索" + ":" + place.FindOne()); System.out.println("全件検索" + ":" +place.FindAll()); List<String> telephoneNumberList = new ArrayList<String>() { { add("111111111"); add("222222222"); add("333333333"); } }; List<String> placeList = new ArrayList<String>() { { add("愛媛"); add("北海道"); add("沖縄"); } }; // 更新 System.out.println("一件更新" + ":" + telephoneNumber.UpdateOne("000000000")); System.out.println("全件更新" + ":" + telephoneNumber.UpdateAll(telephoneNumberList)); System.out.println("一件更新" + ":" + place.UpdateOne("福岡")); System.out.println("全件更新" + ":" + place.UpdateAll(placeList)); // 削除 System.out.println("一件削除" + ":" + telephoneNumber.DeleteOne()); System.out.println("全件削除" + ":" + telephoneNumber.DeleteAll()); System.out.println("一件削除" + ":" +place.DeleteOne()); System.out.println("全件削除" + ":" +place.DeleteAll()); } }
interface側から見るとどのクラスでどんな処理をしているかが見やすいため、ほかの人が見る時にわかりやすいというメリットがありそうです。
後は、interfaceに書かれたメソッドは必ずオーバーライドして実装しなければならないので処理の実装抜けがなくなりますね。
今回は各クラスに実装したinterfaceのメソッドが同じ動きになるようにしましたが、別の動きを加えることも可能です。
interfaceのルール
変数とメソッドの記述可能。
変数はpublic static final となる。
多重実装が可能。
実装したクラスで必ずオーバーライドしなければいけない
オーバーライドとは・・・メソッド名と引数が同じ名前。引数のデータ型が同じで、戻り値のデータ型も同じ。アクセス修飾子が親と同じかそれより広い。