java中的访问器

时间:2013-02-21 13:27:43

标签: java

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

5 个答案:

答案 0 :(得分:6)

有些原因是:

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

请参阅@Aditi提供的链接中的答案,原因如下:Why use getters and setters?

答案 1 :(得分:2)

要追踪的最难形成的错误之一是数据项价值的意外,不恰当的变化。

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

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

答案 2 :(得分:2)

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

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

(2)
现在你想要在一个字段中存储User class fullName,所以你要做的就是在User类中进行更改,你不必chagne getFullName方法的所有调用,如果你是的话,你必须做什么直接使用字段。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

例如

public void setAge(){
  if(age < 0){
     //throw exception
  }
}