模型类在运行时的每个公共字段的Play! framework generates getters and setters。
public class Product {
public String name;
public Integer price;
}
将转换为
public class Product {
public String name;
public Integer price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
本手册进一步解释:
然后,当您想要访问某个属性时,您只需编写:
product.name = "My product";
product.price = 58;
在加载时将其翻译为:
product.setName("My product");
product.setPrice(58);
......并警告:
您不能直接使用getter和setter方法来访问属性 如果你依靠自动生成。这些方法是在 运行。因此,如果您在编写的代码中引用它们,那么编译器 将找不到方法并将产生错误。
因为我不能在Play之外使用这些getter和setter!项目,我认为生成它们没有任何好处。与考虑到的所有现代IDE的公共字段,重构(封装字段和更改调用者)相比,有什么好处?
答案 0 :(得分:8)
简短回答:豆子需要它们。
更长:Beans规范要求(除其他外)每个内部字段的getter / setter。我不是100%肯定,但我认为Hibernate和Groovy模板都需要Java Bean(POJO Beans,而不是Java EE!),因此他们会要求getter / setter。 Play只是节省您的时间,所以您不必担心样板代码(除非您想出于某种原因定义自己的getter / setter,您可以这样做)。
答案 1 :(得分:8)
另一个原因是,虽然您不必指定setter和getter,但您仍然可以!
所以,如果你有(根据你的例子)
product.name = "my product"
这很好,让你的代码更快,在我看来更容易阅读。然而,有一个很好的理由用于封装的setter和getter。如果你想在更改product.name时添加一些逻辑,你可以指定自己的setter,但不必更改上面的代码,因为它将继续在幕后调用setter。
因此,这为您提供了良好封装的灵活性和强大功能,但直接现场访问的整洁性和可读性。
我认为这是两个世界中最好的。
答案 2 :(得分:0)
如果你有一个私有的getter / setter方法,那么这将无法工作,因为无法创建具有相同名称的公共getter / setter方法。所以它会在运行时失败!