Композиция вместо использования наследования - PullRequest
0 голосов
/ 26 мая 2020

У меня был спор с моим коллегой.

Какой из следующих 2 фрагментов кода вам больше нравится, учитывая, что «вместо наследования следует использовать композицию»?

1 )

class JsonToSpecificTransformer implements Transformer {

    private final JsonToObjectTransformer jsonTransformer = Transformers.fromJson(Specific.class);

    @Override
    public Message<?> transform(Message<?> message) {
        return jsonTransformer.transform(message);
    }
}

2)

class JsonToSpecificTransformer2 extends JsonToObjectTransformer {
    public JsonToSpecificTransformer2() {
        super(Specific.class);
    }
}

Класс Speci c покажет что-то вроде этого:

@Data
class Specific {
    private int field1;
    ...
}

Я немного прокомментирую это 2 фрагмента кода:

1) использует композицию и сохраняет и внутренний объект, чтобы он не переинициализировался каждый раз.

2) использует наследование.

Спасибо!

Изменить:

Я использую DSL IntegrationFlow, например:

@Autowired
private JsonToSpecificTransformer jsonToSpecificTransformer;

@Bean
public IntegrationFlow flow() {
   return IntegrationFlows.from("myChannel")
      .transform(Transformers.fromJson(service2.Specific.class)
      or
      .transform(jsonToSpecificTransformer)
      ...
}

Надеюсь, этот предыдущий код немного проясняет мои намерения.

И пытаюсь подвести итог:


@Bean
public JsonToObjectTransformer jsonToSpecificTransformer() {
   return Transformers.fromJson(Specific.class);
}

---
@Autowired
//@Qualif...
private JsonToObjectTransformer  jsonToSpecificTransformer;

@Bean
public IntegrationFlow flow() {
   return IntegrationFlows.from("myChannel")
      .transform(jsonToSpecificTransformer)
      ...
}

1 Ответ

1 голос
/ 26 мая 2020

Действительно. По этой причине не похоже, что вам следует злоупотреблять классами фреймворка. Они могут измениться в будущем, нарушая ваш код.

ИМХО, без наследования, без композиции вообще.

Вы просто можете иметь такой bean-компонент:

@Bean
JsonToObjectTransformer jsonToSpecificTransformer() {
    return Transformers.fromJson(Specific.class);
}

И используйте его как простую Transformer ссылку, когда вам нужно. Что в этом хорошего, вам вообще не нужно иметь никаких дополнительных классов для поддержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...