Java 数据传输对象中的公共字段

Java 数据传输对象中的公共字段,java,coding-style,Java,Coding Style,在我多年的编程生涯中,我经常创建一些类,这些类简单地将一些变量与其setter和getter组合在一起。我见过这些类型的对象被称为值对象、域对象或模型对象,具体取决于使用它们的上下文。最适合一般用法的术语似乎是数据传输对象(DTO)。这描述了一个只包含访问器和变异器的POJO 我刚刚编写了一个这样的对象,其中包含大约50个字段,用于在图表上设置主题参数。现在我想知道我是否应该将这些字段声明为公共字段,而不是生成一百个getter和setter。这样做违背了我编程本能告诉我的一切,但我不能否认,这

在我多年的编程生涯中,我经常创建一些类,这些类简单地将一些变量与其setter和getter组合在一起。我见过这些类型的对象被称为值对象、域对象或模型对象,具体取决于使用它们的上下文。最适合一般用法的术语似乎是数据传输对象(DTO)。这描述了一个只包含访问器和变异器的POJO

我刚刚编写了一个这样的对象,其中包含大约50个字段,用于在图表上设置主题参数。现在我想知道我是否应该将这些字段声明为公共字段,而不是生成一百个getter和setter。这样做违背了我编程本能告诉我的一切,但我不能否认,这将大大提高代码的易读性,减少类中样板代码的数量


使用公共字段的唯一原因是我需要对这些字段执行任何类型的验证。如果我们假设类型验证就我的目的而言已经足够了,那么在这种情况下使用公共字段与面向对象设计的区别是否可以接受?公共数据是否能在大批量操作中表现得更好?

我认为使用公共属性的“设置”或“主题”或“样式”类并不是非常糟糕的做法

如果您想在设定的时间对值进行任何复杂的计算或检查,使用重构工具的现代IDE使得将属性升级到getter/setter变得非常简单

通常在“setTheme”或任何使用这些设置类的函数中,都是进行验证的好地方


当设置这样的设置时,通常适合执行深度复制对象,而不是保留对可变类的引用。

大多数程序员会默认使用带有getter/setter的私有字段,而不考虑它。但就像任何货物崇拜一样,最好是有意识地做出决定

使用getter/setter组合而不是公共字段的主要原因是可以更改定义。因此,如果DTO是组件之间接口的一部分,最好使用getter。如果更改了内部工作方式,则可以调整getter以模仿旧的行为并保持兼容性

另一个原因是您可以创建只读字段。通常对于DTO,只读和不可变是一个不错的选择

第三个原因可能是DTO需要是javabean,因为您打算在需要它的工具中使用它

如果这些属性都不适合您,那么就没有理由不使用公共字段


不过,不要期望有太大的性能差异:)

数据结构和对象之间存在差异

数据结构应该暴露其内部,而不是行为。

物体不应暴露其内部,但应暴露其行为,这也被称为德米特定律

因此,DTO基本上是数据结构。他们应该只公开数据,不需要Getter和setter。验证是一种行为,它不应该是DTO的一部分。它必须有一个不同的对象,即验证对象


受Robert C.Martin(Bob叔叔)的干净代码启发

如果您尝试使用DI框架,如Spring或类似jsp:useBean等,则可能需要重复的getter和setter@桑巴特:在这个问题的公认答案中给出的一些理由在这里适用,但不是全部。DTO的范围和行为与泛型类不同,所以我想知道这里是否会应用不同的“规则”。这正是我需要知道的。如果我总结一下,是否使用公共字段的决定似乎取决于项目的范围、是否重用或连接以及更改的可能性。我也没有考虑到非原始的
final
字段不会是不变的。如果我想使这样一个字段成为只读的,我必须转换整个类以保持统一的访问。另外还有一个用于不兼容性。也可以考虑使用构造函数模式而不是使用设置器。然后,大多数访问将通过getter进行,允许您返回不希望通过副作用间接影响的项目的不可变或安全副本。