有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java域模型映射器应该是静态的吗?

在我参与的许多项目中,我们经常有很多类将内容从一个领域模型映射到另一个领域模型。例如,从WSDL生成的模型到特定于项目的模型

比如

public class FooBarContentMapper {
    public static Foo fromWsToDomain(FooType fooType) {
        ...
    }
}

这也可以是非静态方法,服务层可以有一个mapper对象字段,而不是调用静态方法:

public class FooBarContentMapper {
    public Foo fromWsToDomain(FooType fooType) {
        ...
    }
}

我发现这两种方法都用得很多,但是:

  • 其中一个解决方案在任何方面都更有效吗
  • 是否有任何解决方案被视为最佳实践

共 (2) 个答案

  1. # 1 楼答案

    还有其他一些事情需要考虑: 你的代码是可测试的吗。映射器被用作协作者,因此使用映射器对对象进行单元测试时,应该关注对象的行为(即映射器是否在预期的情况下使用)? 静态类是否在多个地方使用,并且受制于竞争条件,因为transform方法接受可变对象(请记住,当接受两个不同线程同时引用的可变对象时,无状态静态类仍然受制于竞争条件)? 静态对象是否与使用它的对象共享其生命周期

    如果这些问题的答案是肯定的,你应该考虑切换到实例。

  2. # 2 楼答案

    "Is one of the solutions more efficient in any way?"

    定义“高效”。 如果“高效”指的是CPU时间和内存需求,那么“实例”方法永远不会比“静态”方法更高效;充其量,它可以和静态方法一样有效,差异取决于对象实例化的频率,比如:你要实例化“实例”方法多少次

    "Are any of the solutions considered best practice?"

    不是。这里的“最佳实践”是使您的设计与您的需求相匹配

    • 如果映射操作需要维护状态,例如对其他服务/映射程序/诸如此类的依赖,那么使用“实例”方法更有意义。你不想进入的一个世界是,你的应用程序的设计由相互依赖的单例组成。使用“实例”方法,最好使用自动布线工具,如Spring框架或CDI

    • 如果映射操作不需要状态,并且您非常有信心它将来将永远不需要状态,那么使用“静态”方法-,除非您手头已经有一个自动布线工具,在这种情况下,您最好选择带有自动布线的“实例”方法,并保证,如果映射操作将来需要状态,则不必对设计进行太多修改