我有许多相同基类的不同子类,并且所有这些子类都应该由一个接收JsonNode
的工厂方法构造。
由于极大(100个或更多)字段,公共构造函数在我的上下文中不方便。应使用JsonNode
从给定的ObjectMapper
填充这些字段。这是一个例子。
所需的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)
...在描述的背景下?
答案 0 :(得分:0)
据我所知,没有办法做到这一点。 Factory方法必须知道要实例化的类。 但为什么打扰你呢?
MessageA a = AbstractMessage.fromJson(json, MessageA.class);
客户端代码需要提供类
什么?客户端代码知道它需要MessageA
类的实例,为什么不提供它的类?
作为slf4j logger框架中的示例:
org.slf4j.Logger logger = LoggerFactory.getLogger(MyClass.class);
有人抱怨过吗?