java域模型映射器应该是静态的吗?
在我参与的许多项目中,我们经常有很多类将内容从一个领域模型映射到另一个领域模型。例如,从WSDL生成的模型到特定于项目的模型
比如
public class FooBarContentMapper {
public static Foo fromWsToDomain(FooType fooType) {
...
}
}
这也可以是非静态方法,服务层可以有一个mapper对象字段,而不是调用静态方法:
public class FooBarContentMapper {
public Foo fromWsToDomain(FooType fooType) {
...
}
}
我发现这两种方法都用得很多,但是:
- 其中一个解决方案在任何方面都更有效吗李>
- 是否有任何解决方案被视为最佳实践李>
# 1 楼答案
还有其他一些事情需要考虑: 你的代码是可测试的吗。映射器被用作协作者,因此使用映射器对对象进行单元测试时,应该关注对象的行为(即映射器是否在预期的情况下使用)? 静态类是否在多个地方使用,并且受制于竞争条件,因为transform方法接受可变对象(请记住,当接受两个不同线程同时引用的可变对象时,无状态静态类仍然受制于竞争条件)? 静态对象是否与使用它的对象共享其生命周期
如果这些问题的答案是肯定的,你应该考虑切换到实例。
# 2 楼答案
定义“高效”。 如果“高效”指的是CPU时间和内存需求,那么“实例”方法永远不会比“静态”方法更高效;充其量,它可以和静态方法一样有效,差异取决于对象实例化的频率,比如:你要实例化“实例”方法多少次
不是。这里的“最佳实践”是使您的设计与您的需求相匹配
如果映射操作需要维护状态,例如对其他服务/映射程序/诸如此类的依赖,那么使用“实例”方法更有意义。你不想进入的一个世界是,你的应用程序的设计由相互依赖的单例组成。使用“实例”方法,最好使用自动布线工具,如Spring框架或CDI
如果映射操作不需要状态,并且您非常有信心它将来将永远不需要状态,那么使用“静态”方法-,除非您手头已经有一个自动布线工具,在这种情况下,您最好选择带有自动布线的“实例”方法,并保证,如果映射操作将来需要状态,则不必对设计进行太多修改