【问题标题】:Data objects conversion - instance method vs static method数据对象转换 - 实例方法与静态方法
【发布时间】:2016-10-24 06:11:39
【问题描述】:

假设有两个对象,例如。一个代表公共 API (JSON),另一个代表模型(JPA 实体)。它们有一些差异,但大多数时间字段是通用的。

class A {
    String name;
}

class B {
    String name;
}

请注意,为简单起见,我将这些类保持得非常简单。

我们必须将一种转换成另一种才能使这种设计正常工作。

一方面,我们有实例方法。这似乎是一种直观的方法。我们已经有了一个对象,所以实例方法似乎是合乎逻辑的解决方案。访问字段很容易。它也很容易阅读和理解代码。它将一个对象与另一个对象联系在一起,但无论如何它们都是一对。

static class A {
    String name;

    B toB() {
        B b = new B();
        b.setName(name);
        return b;
    }
}

另一种方法是使用静态方法。这似乎更像是一种建造者模式。对象是基于依赖关系构建的。如果需要,转换方法可能会被重载并使用不同的输入,这增加了灵活性。然而,静态方法通常不适用于 OOP 范式。

static class A {
    String name;

    static A from(B b) {
        A a = new A();
        a.setName(b.getName());
        return a;
    }
}

现在,团队之间正在讨论哪种方法在 OOP 方面更好?它们中的任何一个都可以被视为最佳实践吗?或者也许我们应该应用其他解决方案?

简单地说 - 在这种情况下最好的方法是什么?

【问题讨论】:

    标签: java static-methods data-conversion


    【解决方案1】:

    您正在考虑这样一种情况,即您有 2 个相似(并且部分可互换)的类,但每个类都更适合特定用例的需求。这几乎适用于“数组与集合”主题。在 JDK 中,您可以获得帮助转换的帮助类 (utils):请参阅 java.util.Arrays.asList()

    这就是我会采用的方式 - 创建一个单独的类来进行转换。这样您就不必耦合类,并且可以进一步扩展转换选项(即到 C 类)、创建“可插入”转换委托等。对我来说,这听起来是一个更灵活的选择。

    【讨论】:

    • 这似乎是个好主意,我已经考虑过了,但是如果我们要遵循JDK示例,还有一个方法java.time.LocalDateTime#toLocalDatejava.util.stream.Stream#toArray。 JDK 在设计上似乎并不一致。
    • 我不这么认为。特别是,java.util.stream.Stream#toArray 是一种处理结果的方法,而不是流本身。另一方面,Arrays#asList 在 2 个语义相似的类之间进行转换。通过一些抽象,您可以说StreamArray 更多,但List 只是Array 的不同实现。这就是为什么后面的转换是通过util方法完成的,而第一个显然是Stream的方法。
    【解决方案2】:

    第二种方法是不错的方法,因为它遵循设计模式并允许灵活性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 2012-11-12
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多