组合继承使用
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
参考。
这有什么好处,你根本不需要任何额外的 类 来支持。
我和我的一个同事吵架了。
考虑到 "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
参考。
这有什么好处,你根本不需要任何额外的 类 来支持。