所有子类通用的静态工厂方法

时间:2017-12-08 21:00:55

标签: java json oop jackson

我有许多相同基类的不同子类,并且所有这些子类都应该由一个接收JsonNode的工厂方法构造。

由于极大(100个或更多)字段,公共构造函数在我的上下文中不方便。应使用JsonNode从给定的ObjectMapper填充这些字段。这是一个例子。

  • 基类: AbstractMessage
  • 子类: MessageA,MessageB,MessageC,MessageD,...

所需的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

ObjectMapper执行从JsonNode到对象的实际转换的方法会获取所需的类参数,这是示例用法:

ObjectMapper jsonMapper = new ObjectMapper();
JsonNode json = // ...
MessageA a = jsonMapper.treeToValue(json, MessageA.class);

出现问题是因为显然需要运行时类才能实例化同一个类的对象。我希望在基类中有一个静态工厂方法来创建子类对象,以避免重复等。

我提出了以下解决方案:

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);

...其中MessageA是通过MessageB构建的。

有没有办法让我有这样的东西:

MessageA a = MessageA.fromJson(json)

...在描述的背景下?

1 个答案:

答案 0 :(得分:0)

据我所知,没有办法做到这一点。 Factory方法必须知道要实例化的类。 但为什么打扰你呢?

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

客户端代码需要提供类

什么?客户端代码知道它需要MessageA类的实例,为什么不提供它的类?

作为slf4j logger框架中的示例: org.slf4j.Logger logger = LoggerFactory.getLogger(MyClass.class);  有人抱怨过吗?