2017-12-08 18 views
0

同じ基本クラスの多くの異なるサブクラスがあり、それらはすべて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) 

...説明コンテキストで:

私はこのような何かを持っている可能性が方法はありますか?

答えて

0

私が知る限り、これを行う方法はありません。ファクトリメソッドは、インスタンス化するクラスを知っていなければなりません。 しかし、なぜあなたはそれが好きであることを気にしますか?

MessageA a = AbstractMessage.fromJson(json, MessageA.class); 

クライアントコードはクラス

、何を提供する必要がありますか?クライアントコードは、MessageAクラスのインスタンスが必要であることを知っています。なぜクラスを提供しないのですか?

slf4jロガーフレームワークの例: org.slf4j.Logger logger = LoggerFactory.getLogger(MyClass.class); 誰でもそれについて不平を言いますか?

+0

私が言ったように、問題は、 'MessageA a = MessageB.fromJson(json、MessageA.class)'のようにすることができないということです。 'Logger l = LoggerFactory.getLogger(MyClass.class、Logger.class)'のようになります。それを呼び出すのと同じクラスの引数を与えなければならない場合(またはさらに悪い場合:MessageBのような他のいくつかのサブクラス) – wesleyy