Java 中的访问器和修改器

Accessor and Mutator in Java

例如在 main 方法中我有 setFirstName() 并调用 Contact class 来执行此操作。 在联系人中 class 我知道我应该使用:public String getName() 然后 public void setFirstName(String name)

我知道这是正确的方法。 但是相反,我发现如果我这样做:

public String setFirstName(String name)
{
    return this.name=name;
}

这也行,我不需要使用getName()方法。

谁能帮我看看这是为什么?我的accessor/mutator方法正确吗?

getter 和 setters 只是一个约定。编译器不会特别识别它们,或类似的东西。

一个getter,例如public String getFirstName() {return this.name;},只是一个returns字段值的方法。

A setter,例如public void setFirstName(String name) {this.name=name;},只是一种将字段的值设置为其参数的方法。

没有什么强迫您创建 getter 和 setter,如果您不这样做,或者如果您决定以不同的方式实现它们,也不会发生什么坏事。它们通常以这种特定方式编写的原因是它在大多数时间都运行良好。但你不必这样做。

您创建了一个方法:

  • name 字段的值设置为其参数。
  • Returns name 字段的值。

没有错,这是一个完全有效的方法。
它作为 setter 有用吗?当然,它设置了值。
它作为 getter 有用吗?不 - 告诉我,您将如何使用它来获取此人的名字?
但它是一个完全有效的方法,它不是 "right" 或 "wrong",它只是不是特别有用。

访问器的理念就是只读不修改。这是一个有用的约定,因为如果始终如一地完成,它会使推理一些您不了解的代码变得容易得多。通常,您不必期待名为 getX() 的东西会产生奇怪的副作用。做一些懒惰的初始化可能是可以的,但是如果这样的 "lazy getters" 被命名为 getOrCreateX() 或者类似的给用户一个提示,第一次使用可能需要一点 longer/involve 一些昂贵的操作。

一个 returns 东西的突变体可能有用,但如果你以一种提示它是什么的方式命名它,它将帮助你的 class 的用户 return秒。是错误代码还是之前的值?人们不希望从名为 setX() 的东西中获得 return 值,因此他们会惊讶地看到这样的签名,并且必须查看 class 的文档以了解它的作用。

总结:总是像其他人随时必须接管你的代码一样编写代码 - 不要做会令人惊讶的事情。即使您从未将您的代码交给任何其他人,您未来的自己也会感谢您选择能够解释该方法功能的名称。

注意:您对 setter 的实现不是很有用,因为它总是 return 是您刚传入的新值。

setter 和 getter 必须正确实现,因为某些框架依赖于它们才能正常运行。

Mockito 等模拟框架、DI 框架和一些 xml 序列化技术依赖于 set 和 get 方法。