get和set方法的替代样式

时间:2014-07-26 21:57:09

标签: java styles

我们都熟悉Java的“getter& setter”方法。它们是创建数据封装的好方法;确保只能通过这些特定方法访问类代码之外的任何私有字段。然后,这些方法可以包括检查,开销,同步等。

public class Person(){
    private String name;
    private int birthYear;

    // traditional getter/setter syntax
    public String getName(){ return name; }
    public int getBirthYear(){ return birthYear; }
    public void setName(String name){ this.name = name; }
    public void setBirthYear(int birthYear){ this.birthYear = birthYear; }

    // proposed overloading getter/setter syntax
    public String name(){ return name; }
    public int birthYear(){ return birthYear; }
    public void name(String name){ this.name = name; }
    public void birthYear(int birthYear){ this.birthYear = birthYear; }

}

我的问题是,使用方法重载是否有任何问题,以获得getter / setter的“建议”语法?对我而言,它似乎更具可读性和直观性:

Person p = new Person();
p.name("Bob");
System.out.println(p.name());

我能想到的最大的缺点是每个人都习惯了get / set语法,这会让事情变得不那么容易理解。无论如何,这不是一个重大问题,我不介意使用getter / setter,但我只想到了这种看起来更漂亮的替代方式,并想知道其他人的想法?

由于

3 个答案:

答案 0 :(得分:3)

是。虽然" get"和"设置"仅仅是一种约定 - 它们对于Java bean来说是绝对必要的,它们可以正常地与反射一起工作。

您可以阅读有关BeanINfoclass Introspector

的更多信息

答案 1 :(得分:1)

FoggyDay的回答是正确的。许多库和工具都依赖于get / set / is属性命名约定。

但是,Groovy是一种基于JVM的脚本语言,它提供了一些您正在寻找的语法糖:

class Person {
  String name
  int birthYear
}

像这样编译成Java:

public class Person {
  private String name;
  private int birthYear;

  public String getName(){ return name; }
  public int getBirthYear(){ return birthYear; }
  public void setName(String name){ this.name = name; }
  public void setBirthYear(int birthYear){ this.birthYear = birthYear; }
}

请点击此处了解详情:http://groovy.codehaus.org/Groovy+Beans

答案 2 :(得分:0)

对于流行的注释库 lombok 的用户,可以通过在通常位于 src/main/java 下的 lombok.config 文件中设置以下属性来轻松配置。它确保访问器方法没有以 get、set 或 is 为前缀。

lombok.accessors.fluent = true

给定的类编译成这个。请注意允许函数链接的 setter 的返回类型。

@Getter 
@Setter
public class Person {
    private String name;
    private int birthYear;

    public String name() { return name; }
    public int birthYear() { return birthYear; }
    public Person name(String name) { this.name = name; return this; }
    public Person birthYear(int birthYear) { this.birthYear = birthYear; return this; }
}