【发布时间】:2010-12-05 03:20:19
【问题描述】:
给定一个简单的 POJO,它是否真的会有所作为,或者使用以下任一方法是否可能产生副作用:
total = getPriorAmount() + getCurrentAmount();
或
total = this.priorAmount + this.currentAmount;
在 POJO 中使用时。
【问题讨论】:
标签: java
给定一个简单的 POJO,它是否真的会有所作为,或者使用以下任一方法是否可能产生副作用:
total = getPriorAmount() + getCurrentAmount();
或
total = this.priorAmount + this.currentAmount;
在 POJO 中使用时。
【问题讨论】:
标签: java
总会有副作用:-)
在这种情况下,现在可能是一个简单的 POJO。但是在 2 周(月、年)内,有人可能会在您的 getter 方法中添加一些条件逻辑,并且 getCurrentAmount() 可能不再与 this.currentAmount 相同(后者可能是最后一个已知的“缓存”值,例如和 getter方法可能会重新计算它)。
这就是为什么对接口进行编码总是一个好主意,即使在这种情况下接口是对象本身(例如它的公共 getter)。
【讨论】:
虽然从操作的角度来看几乎没有区别,但我会说使用方法而不是直接引用绝对是最佳实践。您永远不知道您今天编写的简单代码何时会增长到直接引用将被某人对局部变量进行更复杂的操作(缓存、从其他数据中重新调用等)破坏的地步。
【讨论】:
一般来说,不没关系。
我会使用第二个示例,因为它消除了间接性,并且您确切地知道您正在访问什么值。您可能稍后决定要在返回值之前对其执行额外的计算,从而改变 getter 方法的含义。 (尽管在这种情况下,您应该创建返回新值的新 getter 方法......但是假设您很累,只是在同一个 getter 中意外添加了一行。)现在,您将获得一个可能的值或者现在可能期望。如果这可能是您想要的,并且您希望将其应用于您的代码,那么很好,如果不是,那么您有问题,或者您会在不知情的情况下得到错误的结果。
【讨论】:
不幸的是,Java 不支持uniform access principle(其他语言,如 C#、Scala 和 Ruby,支持),因此我们被难看且繁琐的 getter/setter 语法所困。
【讨论】: