受益于Play中生成的getter和setter!骨架

时间:2011-09-27 10:19:21

标签: java properties refactoring playframework getter-setter

模型类在运行时的每个公共字段的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的公共字段,重构(封装字段和更改调用者)相比,有什么好处?

3 个答案:

答案 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方法。所以它会在运行时失败!