【问题标题】:Accessor and Mutator in JavaJava 中的访问器和修改器
【发布时间】:2015-06-23 03:15:33
【问题描述】:

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

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

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

这也可以,我不需要使用getName()method。

谁能帮帮我,这是为什么?我的访问器/修改器方法是否正确?

【问题讨论】:

  • 假设您想要name 的当前值,您的解决方案将如何实现?
  • @FrankTby 你可以(也应该)编辑你的问题来改进它。
  • 在某些情况下,mutator 返回前一个值确实有意义(例如参见put method on Map),但您通常还需要一种无需修改即可访问值的方法。
  • 我建议您阅读 Jeff Atwood 撰写的 Coding for Violent Psychopaths,其中包含一句精彩的格言始终编写代码,就好像最终维护您代码的人是一个知道您住在哪里的暴力精神病患者一样。

标签: java getter-setter


【解决方案1】:

访问器的本质是它只读取但不修改。这是一个有用的约定,因为如果始终如一地进行,它会使推理一些你不知道的代码变得容易得多。通常,您不必期待名为 getX() 的东西会产生奇怪的副作用。进行一些惰性初始化可能没问题,但如果将此类“惰性 getter”命名为 getOrCreateX() 或类似名称,以向用户提示第一次使用可能需要更长的时间/涉及一些昂贵的操作,则更清楚。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

     

    您创建了一个方法:

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

    这没有错,这是一种完全有效的方法。
    作为二传手有用吗?当然,它设定了价值。
    作为吸气剂有用吗?不 - 告诉我,您将如何使用它来获取此人的名字?
    但这是一种完全有效的方法,没有“对”或“错”之分,只是不是特别有用。

    【讨论】:

    • 感谢您的回答。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多