get和set方法的可选样式



我们都熟悉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但我只是想到了这个对我来说看起来更漂亮的替代方法,想知道其他人的想法?

谢谢

是。尽管"get"one_answers"set"只是一种约定,但它们对于Java bean正确使用反射是绝对必要的。

你可以通过阅读BeanINfo或Introspector类找到更多信息

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

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

lombok.accessors.fluent = true

给定的类编译成this。注意允许函数链的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; }
}

相关内容

  • 没有找到相关文章

最新更新