【问题标题】:Which is better adding new fields to existing DTO class or new DTO class?向现有 DTO 类或新 DTO 类添加新字段哪个更好?
【发布时间】:2014-11-05 10:10:25
【问题描述】:

这可能是一个一般的 java 问题

DTO1

  1. 属性1
  2. 属性2
  3. 属性3

DTO2

  1. 属性1
  2. 属性2
  3. 属性3
  4. 属性4
  5. 属性5
  6. 属性6
  7. 属性7
  8. 属性8
  9. 属性9
  10. 属性10
  11. 属性11
  12. 属性12

我将在屏幕上的 gxt 网格中显示一些值列表。这些值只不过是一个 DTO1 类的列表,其中我有 3 个字符串,我将从服务调用中获得这些字符串。现在我需要以类似的方式显示 12 个不同的字段,但要基于一个条件(这次我不会显示 DTO1)。

用这 12 个字段创建一个新的 DTO2 类或将这 12 个字段添加到现有的 DTO1 类是否更好(性能方面),这样我就不必再创建一个新的 DTO2 类了。

案例 1. 向现有 DTO 类添加额外字段
每次我使用 DTO 类时,会不会有额外的空间只用于 3 个属性而不是新添加的 12 个属性?

案例 2. 创建了新的 DTO2 类
是否可以像案例 1 一样通过将这 12 个字段添加到 DTO1 来补偿创建的额外空间?

阐明哪种方法可以提高性能?

【问题讨论】:

  • 为什么不 DTO2 扩展 DTO1 ?所以你只把attribute4放到12

标签: java dto


【解决方案1】:

虽然这两种方法在技术上可能都是正确的,但我更倾向于创建新的 DTO 而不是添加更多字段,原因如下:

  1. 它使代码更易于阅读:再加上良好的命名,额外的 DTO 乍一看会让您的继任者不那么头疼。
  2. 类应该只有一个更改理由:将 DTO 与不相关的字段混为一谈会为该类提供多个更改的理由,使其成为不相关的依赖项失败的根源。
  3. 额外的课程不会影响您的申请。

【讨论】:

    【解决方案2】:

    如果您的 DTO2 的 12 个属性中有 3 个与 DTO1 类型相同,则绝对应该使用继承:

    class DTO1{
    
        private String attribute1;
        private String attribute2;
        private String attribute3;
    
        //getters and setters
    }
    
    class DTO2 extends DTO1{
    
         private String attribute4;
        //other attributes
    }
    

    在您需要全部 12 个属性的地方使用 DTO2,当您只需要 3 个属性时使用 DTO1。

    如果您的 DTO2 没有至少 3 个与 DTO1 相同类型的属性,您应该创建一个新的单独的 DTO2 类。将所有 12 个属性添加到 DTO1 并只使用其中的 3 个是没有意义的,因为当您创建 DTO1 的实例时,JVM 将为所有 12 个属性分配内存,即使您没有初始化其他 9 个(每个引用将占用 4/8 字节 - 取决于机器 JVM 正在运行)。

    当然,再多几个字节是无关紧要的,除非您处理 数百万 个 DTO。但是,如果我们考虑设计,以及将来您需要多种 DTO 的可能性,您不应该只依赖一种类型的 DTO 来完成您的工作。

    至于 DTO2 字段增加的额外空间,没有办法。如果你需要12个属性,你必须为它们分配内存,所以这里没有错。

    【讨论】:

    • 谢谢丹尼尔我现在明白了。
    【解决方案3】:

    我真的不担心性能,因为我不相信上述方法之间存在合理的差异。如果您将来需要添加/编辑字段,我宁愿考虑允许您维护应用程序的最佳设计实践。我认为在这里最好有一个单独的 dto,只包含你需要的东西。如果每个 dto 都使用可以放入父类中的相同基本字段,您也可以使用继承,并将其余部分添加到子类中。对于您的示例,属性 1、2、3 将出现在父类中,其余属性将出现在子类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多