组合继承使用

Composition over Inheritance usage

我和我的一个同事吵架了。

考虑到 "composition should be used instead of inheritance",您觉得以下 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);
    }
}

具体的 class 会显示如下内容:

@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)
      ...
}

确实如此。看起来您不应该因此滥用框架 类。它们将来可能会更改以破坏您的代码。

恕我直言,没有继承,根本没有组合。

您可以像这样拥有一个 bean:

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

并在需要时将其用作普通 Transformer 参考。 这有什么好处,你根本不需要任何额外的 类 来支持。