同じ基本クラスの多くの異なるサブクラスがあり、それらはすべてJsonNode
を取るファクトリメソッドからのみ構築する必要があります。すべてのサブクラスで共通の静的ファクトリメソッド
非常に大きい(100以上の)フィールドがあるため、パブリックコンストラクタは私の状況では便利ではありません。これらのフィールドにはから、ObjectMapper
を使用して入力します。ここに例があります。
- 基本クラス:のAbstractMessage
- サブクラス:MessageA、MessageB、MessageC、メッセージとして送られ、...
理想のAPI:
MessageA a = MessageA.fromJson(json); // json of type JsonNode
MessageB b = MessageB.fromJson(json); // json of type JsonNode
MessageC c = MessageC.fromJson(json); // json of type JsonNode
オブジェクトへJsonNode
から実際の変換を行いObjectMapper
からメソッド所望のクラス引数に取り、これは使用例である:
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode json = // ...
MessageA a = jsonMapper.treeToValue(json, MessageA.class);
問題は、明らかに、発生同じクラスのオブジェクトをインスタンス化するには、ランタイムクラスが必要です。そして、私は重複を避けるために、サブクラスのオブジェクトを作成するために、基本クラスのstaticファクトリメソッドを持ちたいなど
私は、次の解決策を考え出した:
のAbstractMessage、基底クラス
private static final ObjectMapper jsonMapper = new ObjectMapper();
public static <T extends AbstractMessage> T fromJson(JsonNode json, Class<T> cls) {
return jsonMapper.treeToValue(json, cls);
}
これに伴う問題は、そのクライアントコードはクラスを提供する必要があり、そして次は(可能にすべきではないもの)も可能である:
JsonNode json = // ...
MessageA a = MessageB.fromJson(json, MessageA.class);
... MessageB
によってMessageA
が構築されます。
MessageA a = MessageA.fromJson(json)
...説明コンテキストで:
私はこのような何かを持っている可能性が方法はありますか?
私が言ったように、問題は、 'MessageA a = MessageB.fromJson(json、MessageA.class)'のようにすることができないということです。 'Logger l = LoggerFactory.getLogger(MyClass.class、Logger.class)'のようになります。それを呼び出すのと同じクラスの引数を与えなければならない場合(またはさらに悪い場合:MessageBのような他のいくつかのサブクラス) – wesleyy