在我多年的编程中,我经常创建一些类,只需将一些变量与setter和getter组合在一起。我已经看到这些类型的对象被称为值对象,域对象或模型对象,具体取决于它们使用它们的上下文。通用用法的最合适术语似乎是数据传输对象(DTO)。这描述了一个仅包含访问器和更改器的POJO。
我刚刚编写了一个这样的对象,其中包含用于在图表上设置主题参数的大约50个字段。现在我想知道如果不是生成一百个getter和setter,我应该将这些字段声明为public。这样做违背了我编程本能告诉我的一切,但我不能否认它会大大增加我的代码的易读性并减少类中样板代码的数量。
我可以看到不使用公共字段的唯一原因是我需要对这些字段执行任何类型的验证。如果我们假设类型验证足以满足我的目的,那么在这种情况下使用公共字段是否可以接受面向对象设计?公共DTO在大批量操作中表现更好吗?
答案 0 :(得分:29)
大多数程序员默认使用getter / setter私有字段而不考虑它。但是,像任何货物崇拜的东西一样,最好做出有意识的决定。
使用getter / setter组合而不是公共字段的主要原因是您可以更改定义。因此,如果您的DTO是组件之间接口的一部分,那么最好使用getter。如果更改内部工作,则可以调整getter以模拟旧行为并保持兼容性。
另一个原因是你可以制作只读字段。通常对于DTO来说,只读和不可变是一个不错的选择。
第三个原因可能是你的DTO需要是一个javabean,因为你打算在一些需要它的工具中使用它。
如果这些属性都不适合您,则没有理由不使用公共字段。
不要指望性能差异很大:)
答案 1 :(得分:5)
我认为使用公共属性设置'settings'或'theme'或'style'类并不是一种非常糟糕的做法。
如果您想在设定时间进行任何复杂的计算或检查值,那么使用重构工具的现代IDE可以将属性提升为getter / setter。
通常在你的'setTheme'或任何消耗这些设置类的函数中都是一个很好的验证方法。
设置这样的设置时,通常需要执行深度复制的对象,而不是保留对可变类的引用。
答案 2 :(得分:1)
DataStructure 和 Object 之间存在差异。
数据结构应该暴露其内部而不是行为。
物体不应该暴露它的内脏,而应该暴露它的行为,这也被称为得墨忒耳法则
所以,DTO 基本上是数据结构。他们应该只公开他们的数据,他们不需要 Getter 和 Setter。验证是行为,它不应该是 DTO 的一部分。它必须有一个不同的对象,即验证对象。
灵感来自 Clean Code 作者:Robert C. Martin(鲍勃叔叔)