【问题标题】:Static factory method common for all subclasses所有子类通用的静态工厂方法
【发布时间】:2017-12-08 21:00:55
【问题描述】:

我有许多同一个基类的不同子类,所有这些子类都应该完全由一个接受JsonNode 的工厂方法构造而成。

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

  • 基类: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 实际转换为 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)

...在所描述的上下文中?

【问题讨论】:

    标签: java json oop jackson


    【解决方案1】:

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

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

    客户端代码需要提供类

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

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

    【讨论】:

    • 就像我说的那样,问题在于能够执行以下操作是错误的:'MessageA a = MessageB.fromJson(json, MessageA.class)'。这就像'Logger l = LoggerFactory.getLogger(MyClass.class,Logger.class)'。你必须在调用它的同一个类的参数中给出(或者更糟糕的是:其他一些子类,比如 MessageB)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多