2

Factoryメソッドパターンの私の最も嫌いな側面は、長いif/thenまたはcaseステートメントのほとんど避けられない必要性です。解決するクラスが多いと、さらに悪化します。私は長いif/thensが好きではありません。

次の例を考えてみましょう。

public class StatementFactory 
{
    public static Statement createStatement(String stmtSql)
    {
        Statement rslt = null;

        String frstWord = stmtSql.split("\\s+")[0].toUpperCase();

        if(frstWord.equals("SELECT"))
        {
            rslt = new SelectStatement(stmtSql);
        }
        else if(frstWord.equals("UPDATE"))
        {
            rslt = new UpdateStatement(stmtSql);
        }
        else if(frstWord.equals("INSERT"))
        {
            rslt = new InsertStatement(stmtSql);
        }
        else if(frstWord.equals("DELETE"))
        {
            rslt = new DeleteStatement(stmtSql);
        }

        return rslt;
    }
}

私がやりたいのは、frstWordをさまざまなStatement実装のコンストラクターのポインターにマップする静的マップを作成することです。これにより、特定のfrstWordのマップからポインターを取得して、このif / then醜さではなく、新しいインスタンスを作成できます。 。もちろん、今はリフレクションを使用して実行できますが、if/thenよりもさらに醜くなります。

私の質問は次のとおりです。Java8のクロージャがこの問題を解決し、上記の目的の機能を提供することを期待できますか?

4

3 に答える 3

5

Java SE 7でも、次のように記述できます。

    switch (frstWord) {
        case "SELECT": return new SelectStatement(stmtSql);
        case "UPDATE": return new UpdateStatement(stmtSql);
        case "INSERT": return new InsertStatement(stmtSql);
        case "DELETE": return new DeleteStatement(stmtSql);
        default: throw new IllegalArgumentException();
    }

この種のものについてすべてのヒップを取得する必要はありません。

于 2013-02-25T20:49:20.137 に答える
3

何かのようなもの

static Map<String, Function<String,Statement> map = new HashMap<>();
static
{
    map.put("SELECT", SelectStatement::new);
    // etc...
}

public static Statement createStatement(String stmtSql)
{
    ...
    return map.get(fstWord).apply(stmtSql);
}

もちろん、Java 7でも同様のことを匿名の内部クラスで行うことができますが、これは少し言葉遣いです。


コンストラクターのリファレンスについては、 http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.htmlSelectStatement::newのセクション9を参照して ください。

于 2013-02-25T20:33:53.253 に答える
0

You can do this without closures

interface StatementCreator<T> {
    T createStatement(String sql);
}

public class SelectStatementCreator implements StatementCreator<SelectStatement> {

    SelectStatement createStatement(String sql) {
        return new SelectStatement(sql);
    }
 }

similarly for the update, insert and delete statements. Then you map is created static or singleton or whatever...

static Map<String, StatementCreator<?>> factories = new HashMap<>();

static {
    factories.add("SELECT", new SelectStatementCreator());
}

Then pick up the creator and execute it

return map.get(frstWord).createStatement();

Ta Da!

于 2013-02-25T20:43:06.260 に答える