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