4

我想知道为什么在 java 中使用 getter 和 setter 方法。如果您可以通过 getter 和 setter 读取或修改私有字段的值,为什么不直接将它们更改为 public?我知道 getter 和 setter 必须是合理的,但是不能放弃它们的直接答案是什么?

4

5 回答 5

6

一些原因是:

  • 您可以添加额外的约束和检查。例如,如果一个特定的整数属性必须在 [10..20] 范围内,您可以轻松地添加一个检查以setter确保该属性上没有设置其他值。
  • 您可以通过提供 only 将它们设为“只读” getter
  • 您可以轻松地在 setter 上设置源断点,以查看修改值的时间和位置。
  • 您可以轻松添加日志记录以跟踪曾经设置的值。

有关其他原因,请参阅@Aditi 提供的链接中的答案:为什么使用 getter 和 setter?

于 2013-02-21T13:30:08.063 回答
2

这是将接口与实现分离 (1) 并准备更改 (2) 的方法。也许简单的例子可以提供帮助。

(1)
假设您有一个 User 类,它将 firstName 和 secondName 存储在单独的字段中。现在您可以拥有连接 fisrtName 和 secondName 的方法 getFullName 但是使用 User 类的程序员不必知道 firstName 和 secondName 是两个独立的字段。

(2)
现在您想将全名存储在用户类中的一个字段中,因此您所要做的就是在用户类中进行更改,并且您不必更改 getFullName 方法的所有调用,以防万一如果您直接使用字段。

于 2013-02-21T13:35:10.093 回答
2

最难追踪的错误形式之一是数据项值的意外、不适当的变化。

如果数据是公开的,那么进行更改的代码可能在程序中的任何位置。

如果它是私有的,则进行更改的代码必须在同一个源文件中,通常是同一个类。很容易找到和检测所有可能更改它的代码,包括它的 setter。

于 2013-02-21T13:31:05.453 回答
1

将字段设为私有以保留 Java 类中的封装是一种很好的做法。应用程序中的任何内容都不应该知道您的类的“内部”,即实现细节。他们唯一需要访问的是对象上的方法,以请求值或执行流程。

在某些情况下,您可能希望将某些内部值的访问权限授予另一个类。在这种情况下,建议通过 getter 进行,而不是直接进行。这样,当您需要更改该类的契约和/或其实现细节(如何在内部存储值)时,重构会容易得多。

此外,由于使用 getter/setter 是一种常见模式,这使您的代码更容易被外部读者或同事阅读,并且一些第三方库希望它们存在。

于 2013-02-21T13:31:51.243 回答
0

通过使用 getter 和 setter 而不是直接访问成员变量,我们可以进行数据验证。

例如

public void setAge(){
  if(age < 0){
     //throw exception
  }
}
于 2013-02-21T13:32:18.337 回答