Java インターフェース 実装してみる
前回の記事で、インターフェースのメリットが解った?ところで、実装をしてみます。
blueskyarea.hatenablog.com
今回は、データベースからデータを取り出すところに、Dao インターフェースを実装します。
インターフェースの定義
Dao をインターフェースを定義します。
データベースから全てのデータを取得するための、getAll() メソッドを定義しています。
public interface Dao { Map<Integer, String> getAll(); }
MySqlDao の作成
例としてMaySql からデータを取得するとして、MySqlDao を作成します。
Dao インターフェースを実装するため、getAll() の実装が強制されます。
もちろん戻り値の型も インターフェース側で定義したものと同じ Map
これは MySqlDao の実装担当者が、意図しない型でデータを返却することを防いでくれます。
public class MySqlDao implements Dao { @Override public Map<Integer, String> getAll() { Map<Integer, String> map = new HashMap<>(); map.put(1, "mysql1"); map.put(2, "mysql2"); map.put(3, "mysql3"); return map; } }
※今回は例なので、単に固定値を返しているだけです
クライアント の作成
MySqlDao を実際に使うクライアントを作ります。
public class Client { public static void main(String[] args) { Dao dao = new MySqlDao(); new Client().getData(dao); } private void getData(Dao dao) { dao.getAll().forEach((key, value) -> { System.out.println(key + ":" + value); }); } }
実行1
1:mysql1 2:mysql2 3:mysql3
このように期待した値が得られています。
MySql -> Postgres への変更
さてここで、データソースを MySql から Postgres に変更することになりました。
もちろんクライアント側は、同じ出力結果を期待しています。
まず、Postgres からデータを取得するための PostgresDao を作成します。
同じく Dao を実装しているので、getAll() の実装が強制されます。
クライアント側は、MySql の時と同じ出力結果を期待しているので、これは好都合です。
public class PostgresDao implements Dao { @Override public Map<Integer, String> getAll() { Map<Integer, String> map = new HashMap<>(); map.put(1, "postgres1"); map.put(2, "postgres2"); map.put(3, "postgres3"); return map; } }
クライアント側で使う Dao を変更
あとは、クライアント側で使う Dao を MySql から Postgres に変更してあげます。
以下のように、変更したのは、生成する dao インスタンスだけです。
public class Client { public static void main(String[] args) { //Dao dao = new MySqlDao(); Dao dao = new PostgresDao(); // 変更したのはここだけ new Client().getData(dao); } private void getData(Dao dao) { dao.getAll().forEach((key, value) -> { System.out.println(key + ":" + value); }); } }
実行2
1:postgres1 2:postgres2 3:postgres3
このようにクライアント側では、使用する Dao を変更しただけで、期待する結果を得ることができました。
これは利用者側にとって好都合です。
利用者側は、Dao がどのようにデータをデータベースから取得しているかなどは意識する必要がありません。
使いたいデータベースの Dao を使うだけで、期待する値が得られます。
感想
個人的に同じシステムにおいて、データソースを途中で変更するというケースに遭遇したことがないので、この恩恵を実際に得られたことはないです。
ただ、インターフェースを使うことによって、疎結合を実現できれば、変更に強いシステムになり得ることは理解できました。