在 getter 和 setter 中进行一些数据处理/验证是一种好习惯吗?在维基百科中here有两个例子:
- setDate 方法将 java.util.Date 日期存储在 3 个独立的私有(private)字段中,例如年、月、日
- getAmount 方法连接 2 个字段数字和货币并返回类似“100 美元”的内容。也可能amount字段本身根本不存在,getAmount只是一种计算方法。
这些是很好的例子还是最好避免?如果最好避免它,我怎样才能以更好的方式实现上面的这两个示例?
更新: 请不要认真对待带有日期等的例子。这只是一个例子,当然可以很愚蠢。
我的真实例子。
我有一个外部第三方系统,我必须进行集成。这个外部系统期望我提供一些数据作为带有 getter 和 setter 的类。我必须在那里传递 2 个字段,id(类似于 09df723987cd7(比如说 GUID))和 formattedID,类似于“objecttype/09df723987cd7”。我无法更改此外部系统。
我想这样实现
getId() {
return id
}
getFormattedId() {
return objectType + "/" + id;
}
objectType 是此类中的另一个字段。
我的问题:是否可以,或者有更优雅的实现方式?
最佳答案
您提供的示例不合适,至少不符合您提到的形式和名称。
我会尝试一些更好的例子:
二传手
您可能主要想将它们用于验证。例如 setDate(Date d)
可以检查数据是否在某个范围内,例如 future 不超过 20 年等(取决于您的要求)。
setter/getter
如果它们包含的不仅仅是简单的逻辑,它们可能代表虚拟属性,即没有基础字段但即时计算的属性。
让我们以 getAmount()
为例:可能没有任何字段 amount
或者由于某种原因(例如没有精度问题)。因此 getAmount()
可能看起来像这样:
public double getAmount() {
return amountInCents / 100.0;
}
请注意,名称 getAmount()
可能会产生误导,因此您最好使用 getAmountInUSD()
或类似的名称。
一般
在大多数情况下,建议在 Java 中使用 getter 和 setter,因为您可以执行以下操作(列表不完整):
- 添加验证逻辑(到 setter )
- 为虚拟属性添加转换逻辑(setters、getters)
- 定义访问权限,即只读意味着没有公共(public) setter
- 使用基于 Java Beans 规范的库(需要使用 setter 和 getter)
- 解耦 getter/setter 的客户端/调用者,即如果在某个时候你想添加通过 setter 完成字段访问的验证,则不需要客户端更改(除非需要处理验证错误)等。
- 使用 setter 和 getter 进行调试,例如通过在该方法上放置一个断点并查看堆栈跟踪以查看调用它的人(dsp_user 提到)
关于java - Java 中的 Getter 和 Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39702507/