Java中的访问器和变异器

Java中的访问器和变异器,java,getter-setter,Java,Getter Setter,例如,在main方法中,我有setFirstName(),并调用Contact类来执行此操作。 在contact类中,我知道我应该使用:publicstringgetname() 然后public void setFirstName(字符串名) 我知道这是正确的方法。 但相反,我发现如果我这样做: public String setFirstName(String name) { return this.name=name; } 这也会起作用,我不需要使用getName()方法 谁能帮

例如,在main方法中,我有
setFirstName()
,并调用Contact类来执行此操作。 在contact类中,我知道我应该使用:
publicstringgetname()
然后
public void setFirstName(字符串名)

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

public String setFirstName(String name)
{
    return this.name=name;
}
这也会起作用,我不需要使用
getName()
方法


谁能帮我一下为什么?我的访问器/变异器方法正确吗?

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

getter,例如
公共字符串getFirstName(){return this.name;}
,只是一个返回字段值的方法

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

没有什么强迫您创建getter和setter,如果您不创建getter和setter,或者如果您决定以不同的方式实现它们,那么就不会发生什么坏事。它们通常以这种特殊的方式编写的原因是,它在大多数情况下都能很好地工作。但你不必这么做

您已经创建了一个方法,该方法:

  • name
    字段的值设置为其参数
  • 返回
    名称
    字段的值
这没什么错,这是一个非常有效的方法。
它作为setter有用吗?当然,它会设置值。
它作为一个getter有用吗?不-告诉我,你会如何使用它来获取此人的名字?

但这是一种完全有效的方法,它不是“对”或“错”,只是没有特别的用处。

存取器的基本思想是只读取,不修改。这是一个有用的约定,因为如果始终如一地这样做的话,就可以更容易地对一些您不太了解的代码进行推理。通常情况下,您不必指望名为
getX()
的东西会产生奇怪的副作用。执行一些惰性初始化可能没问题,但如果将此类“惰性getter”命名为
getOrCreateX()
或类似名称,则更清楚,这会提示用户第一次使用可能需要更长的时间/涉及一些昂贵的操作

返回某些内容的mutator可能很有用,但如果您以提示类返回内容的方式命名它,它将帮助类的用户。是错误代码还是以前的值?人们不希望从名为
setX()
的东西返回值,因此他们会惊讶地看到这样的签名,并且必须查看类的文档以了解它的功能

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


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

setter和getter必须正确实现,因为某些框架依赖它们才能正常工作


Mocking框架,如Mockito、DI框架和一些xml序列化技术依赖于set和get方法

假设您想要
name
的当前值,您的解决方案将如何获得该值?@FrankTby您可以(并且应该)编辑您的问题以改进它。在某些情况下,让变异子返回以前的值是有意义的(参见示例),但你通常也希望有一种方法可以在不修改的情况下访问某个值。我建议你阅读杰夫·阿特伍德(Jeff Atwood)的著作,其中包括一句绝妙的格言:“代码永远是代码,就好像最终维护代码的人是一个知道你住在哪里的暴力精神病患者一样。”谢谢你的回答。