0

「動的列挙」は「静的変数」のような矛盾した表現ですか? ;-)

春に浸ったのはほんの少しの時間で、まだ春のようには思えません。タイプセーフで動的な列挙が必要です。このパターンは、後続のサブクラスが列挙を展開できるようにするイベントやエラー コードなどに使用しました。「enum」は拡張できないため、列挙パターン クラスが残されます。例(簡略化):

public class EventType {

    private String name;    

    private static HashMap<String, EventType> cache 
                     = new HashMap<String, EventType>();

    protected EventType(String name) {
        if (cache.containsKey(name)) {
            throw new RuntimeException("EventType '" + name + "' already exists!");
        } else {
             this.name = name;
             cache.put(name, this);
        }
    }

    public static AuditEventType parse(String name) {
        return cache.get(name);
    }

    public static final EventType EVENT_START = new AuditEventType("Start");
    public static final EventType EVENT_END   = new AuditEventType("End");
    public static final EventType EVENT_FAIL  = new AuditEventType("Fail");
}

問題は、Spring をミックスに追加したときに始まります。これは単なる文字列なので、EventType に "@Embeddable" と注釈を付け、それを使用するクラスはそのメンバーに "@Embedded" と注釈を付けます。これは、queryDSL-jpa を使用してクエリを実行するまではうまく機能しているように見えました。DSL は DB テキストを EventType に変換しようとしますが、文字列と型が一致しません。つまり、私は言うことができませんでした: WHERE EventType = "Start". このようなフィールドを持つクラスに文字列として格納し、ゲッターで EventType オブジェクトに解析することで、これを回避しました (エレガントではありません)。したがって、JPA に関する限り、これは単純な文字列にすぎません。

現在、サービス API で問題が発生しています。EventType パラメーターを持つメソッドがあります。問題は、JsonRpcServer クラスが String をインスタンス化して EventType に変換しようとしていることです。もちろん、これは「すでに存在します!」をスローします。例外。

@JsonTypeResolver を使用して、この 2 番目の問題を解決できる可能性があります (現在読んでいます)。しかし、これらの悪ふざけはすべて間違っていると感じています。これはよくある問題であり、より良い解決策が必要です。Spring でそのようなクラスを処理する適切な方法は何ですか? (実際にはBeanではなく、保護されたコンストラクターがあります)。

(私たちのコードが使用するいくつかのプロプライエタリ ライブラリに関する詳細を省略しているため、「ああ、代わりに 'X' を使用する必要があります」などの回答を採用できない場合があります。ご理解いただきありがとうございます。)

4

1 に答える 1