Статический метод фабрики, общий для всех подклассов

wesleyy спросил: 14 ноября 2017 в 07:20 в: java

У меня есть много разных подклассов одного и того же базового класса, и все они должны быть созданы исключительно из фабричного метода, который принимает 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)

... в описанном контексте?

0 ответов