【发布时间】:2017-12-08 21:00:55
【问题描述】:
我有许多同一个基类的不同子类,所有这些子类都应该完全由一个接受JsonNode 的工厂方法构造而成。
由于字段非常大(100 个或更多),在我的上下文中,公共构造函数并不方便。应该使用ObjectMapper 从给定的JsonNode 填充这些字段。这是一个例子。
- 基类:AbstractMessage
- 子类:MessageA、MessageB、MessageC、MessageD、...
所需的 API:
MessageA a = MessageA.fromJson(json); // json of type JsonNodeMessageB b = MessageB.fromJson(json); // json of type JsonNodeMessageC c = MessageC.fromJson(json); // json of type JsonNode
ObjectMapper 中的方法将 JsonNode 实际转换为 object 接受所需的类参数,这是示例用法:
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)
...在所描述的上下文中?
【问题讨论】: