Java中的Getter和Setters

Zle*_*lik 5 java getter-setter

在getter和setter中进行一些数据处理/验证是否是一种好习惯?在维基百科中有两个示例:

  • setDate方法将java.util.Date日期存储在3个单独的私有字段中,例如年,月,日
  • getAmount方法连接2个字段数字和货币,并返回类似“ 100 USD”的信息。也许数量字段本身根本不存在,而getAmount只是一种计算方法。

这些是好的例子还是最好避免?如果最好避免这种情况,如何更好地实现以上两个示例?

更新:请不要以日期等为严重的例子。这只是一个例子,当然它可能是愚蠢的。

我有的真实例子。

我有一个外部第三方系统,我必须进行集成。这个外部系统从我那里希望得到一些带有getter和setter方法的数据。我必须在此处传递2个字段,id(类似于09df723987cd7(假设为GUID))和formattedID类似于“ objecttype / 09df723987cd7”。我无法更改此外部系统。

我想像实施

getId() {
  return id
}

getFormattedId() {
    return objectType + "/" + id;
}
Run Code Online (Sandbox Code Playgroud)

objectType是此类中的另一个字段。

我的问题:可以,还是有一些更优雅的实现方法?

Tho*_*mas 2

您提供的示例不太合适,至少在形式和您提到的名称上不合适。

我将尝试一些更好的例子:

塞特犬

您可能主要想将它们用于验证。例如,setDate(Date d)可以检查数据是否在某个范围内,例如未来不超过 20 年等(取决于您的要求)。

吸气剂

如果这些包含的不仅仅是简单的逻辑,它们可能代表虚拟属性,即没有基础字段但动态计算的属性。

让我们举getAmount()个例子:可能没有任何字段amount,或者由于某种原因(例如没有精度问题),金额可能以美分(或更小)存储。因此getAmount() 可能看起来像这样:

public double getAmount() {
  return amountInCents / 100.0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,该名称getAmount()可能会产生误导,因此您最好使用类似getAmountInUSD()或相似的名称。

一般的

在大多数情况下,建议在 Java 中使用 getter 和 setter,因为您可以执行以下操作(列表不完整):

  • 添加验证逻辑(到设置器)
  • 为虚拟属性添加转换逻辑(setter、getter)
  • 定义访问权限,即只读意味着没有公共设置器
  • 使用基于 Java Beans 规范的库(需要使用 setter 和 getter)
  • 将 getter/setter 的客户端/调用者解耦,即,如果在某个时候您想要添加通过 setter 完成字段访问的验证,则不需要客户端进行更改(除非需要处理验证错误)等。
  • 使用 setter 和 getter 进行调试,例如在方法上放置断点并查看堆栈跟踪以查看谁调用了它(由dsp_user提到)