我们都熟悉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; }
}