【问题标题】:Getters and Setters - proper conventionGetter 和 Setter - 正确的约定
【发布时间】:2013-05-27 12:30:37
【问题描述】:

我被告知以下代码不遵循正确的 getter 和 setter 约定。我正在努力寻找为什么或在哪里。我正在使用构造函数将新的团队名称传递给 set 方法。我是 Java 的初学者,但我认为 getter 和 setter 方法看起来都不错。我错了吗?谢谢。

public class Team {

  private String teamName;

  public Team(String newName) {
    setName(newName);
  }

  public String getName() {
    return teamName;
  }

  public void setName(String newName) {
    teamName = newName;
  }

  public String toString() {
    return teamName;
  }

  public boolean equals(Team t){
    if(t.getName().equals(teamName)){
        return true;
    } else{
        return false;
    }       
  }

}

【问题讨论】:

  • 与您的问题无关,但equals() 的正确签名采用Object 参数。同样,一旦实现equals()hashCode() 也应该实现......
  • 谈到适当的约定,原始字段的名称会更好看为name。在成员名称中使用“团队”是多余的。
  • 另外:return t.getName().equals(teamName); 是相同 equals() 代码的较短版本。

标签: java


【解决方案1】:

如果变量名是X,那么getter/setter 就是getX/setX

任何好的 IDE,比如 IntelliJ,都会为你生成这些。

它还会为您正确生成 equals,而您没有这样做,并为您提供一个 hashCode。你总是需要同时实现这两者。阅读 Joshua Bloch 的“Effective Java”chapter 3 了解其中的方法和原因。

【讨论】:

  • 除非数据类型是boolean,其中约定可以是getX/setXisX/setX
【解决方案2】:

应该是getTeamNamesetTeamName。通常,如果您的属性名为foo,则getter 和setter 将分别为getFoosetFoo

当然,您也可以将属性名称从 teamName 重构为 name,因为您的类已经被称为 Team,正如 cmets 中所建议的那样。

【讨论】:

  • 我不同意,getTeamName/setTeamName 是多余的,你知道它是一个团队,如果你已经知道它是一个团队,为什么还要在你的代码中写 Team? getName/setName 似乎完全有效且更可取恕我直言,特别是如果您要使用接口。因此我认为他应该将他的变量重命名为name, IMO。
  • @miguel.martin 看到 OP 在询问适当的约定,若昂席尔瓦的回答是正确的。您是否不同意惯例完全是另一回事。
  • @nickecarlo 将变量 teamName 重命名为 name 也会使他的代码具有适当的约定,但冗余较少。 (以及更少更改的代码)
  • @miguel.martin 我同意。但这不是问题的一部分。
  • 我认为 miguel 是对的 - 最好给出正确答案并解释原因,而不是拘泥于问题的狭隘范围。
【解决方案3】:

按照以下链接了解命名约定

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html

另外,PDF Specification

第 8.8 节“推断名称的大写”以及属性名称应该如何。

【讨论】:

    【解决方案4】:

    getter 和 setter 应该引用属性名称。

    在这种情况下,正确的约定必须是 getTeamNamesetTeamName

    【讨论】:

      【解决方案5】:

      对于名为 teamName 的变量,您的 setter 称为 setTeamName

      同样不要在构造函数中使用 setter 和 getter 方法,因为 setter 可能会被扩展类覆盖。通过这种方式,您可以仅通过更改 setter 而不是构造函数来更改构造函数的行为。应该避免这种情况。所以在构造函数中你应该使用

      public Team(String newName) {
        teamName = newName;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-03
        • 1970-01-01
        • 2014-05-20
        • 2013-08-05
        • 2011-04-06
        • 2011-02-26
        相关资源
        最近更新 更多