"ポリモーフィズムの例をもうちっと実用的に書いてみた。"を見て俺も書いてみた

Posted by kenchan 2008-05-10 10:24:00

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行ってないかも…