"ポリモーフィズムの例をもうちっと実用的に書いてみた。"を見て俺も書いてみた
http://d.hatena.ne.jp/daisuke-m/20080509/1210337941
こういう問題は、実は大好物なので俺も書いてみたよ!
まず、どうやって使いたいか考えたけど、俺はこんな感じ。
Main.java
public class Main {
public static void main(String[] args) {
Table table = new Table("users");
table.columns.add(new Column("name", "string"));
table.database = Database.MySQL;
System.out.println(table.toSQL());
}
}
Table.toSQLでテーブル生成のSQLがほしいと思った。columnsをpublicにするのはちょっとリスキーすぎるけど、ここでは触れないことにする。あと、columnのタイプもenumにしたいけど我慢する。
で、書いたコードは以下のとおり。Converterの実装クラスとColumnは自明なので省略する。
Table.java
import java.util.ArrayList;
public class Table {
public String name;
public ArrayList<Column> columns = new ArrayList<Column>();
public Database database = Database.GENERIC;
public Table(String name) {
this.name = name;
}
public String toSQL() {
return this.database.converter.convert(this);
}
}
Database.java
public enum Database {
GENERIC(new GenericSQLConverter()),
MySQL(new MySQLConverter()),
PostgreSQL(new PostgreSQLConverter());
public final Converter converter;
private Database(Converter converter) {
this.converter = converter;
}
}
Conveter.java
public interface Converter {
public String convert(Table table);
}
これで、Conveterの実装クラスを書けば、Database.javaに1行追加するだけで使えるようになるね!しかも、IDEでの補完もばっちり!さらにタイプセーフ! 一行も書かないようにするにはDIのお手伝いが必要だから、この辺で我慢しようね!
久しぶりにjava書いたら、enumの書き方をすっかり忘れてたのはtwitterに書いたとおりw
typoのエントリを書くページにはトラックバック先のURLを入れるところがないんだけど、本文に言及すればいいのかな?よくわからんのでTB行ってないかも…