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

Posted

技术标签:

【中文标题】受益于 Play 中生成的 getter 和 setter!框架【英文标题】:Benefit from generated getters and setters in Play! framework 【发布时间】:2011-09-27 10:19:20 【问题描述】:

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

【问题讨论】:

【参考方案1】:

简短回答:Bean 需要它们。

更长:Beans 规范要求(除其他外)每个内部字段的 getter/setter。我不是 100% 确定,但我假设 Hibernate 和 Groovy 模板都需要 Java Bean(POJO Bean,而不是 Java EE!),因此他们会要求 getter/setter。 Play 只是为您节省了这样做的时间,因此您不必担心样板代码(除非您出于某种原因想要定义自己的 getter/setter,您可以这样做)。

【讨论】:

+1 好答案。我已经扩展了关于定义自己的 setter 和 getter 的观点,因为我认为这是非常重要的一点。【参考方案2】:

另一个原因是,虽然您不必指定 setter 和 getter,但您仍然可以!

所以,如果你有(根据你的例子)

product.name = "my product"

这很好,让您的代码更快,在我看来更易于阅读。但是,对于 setter 和 getter 进行封装是有充分理由的。如果您想在您的 product.name 更改时添加一些逻辑,您可以指定自己的 setter,但您不必更改上面的代码,因为它会继续在后台调用 setter。

因此,这为您提供了良好封装的灵活性和强大功能,以及直接字段访问的简洁性和可读性。

我认为这是两全其美的。

【讨论】:

但是因为“属性”只能在同一个 Play 中使用!项目我可以很容易地使用我的 IDE 中的重构。 是的,但是你失去了可读性。我找到真正有帮助的地方是在模板中。【参考方案3】:

如果您有私有的 getter/setter 方法,那么这将不起作用,因为无法创建具有相同名称的公共 getter/setter 方法。所以它会在运行时失败!

【讨论】:

以上是关于受益于 Play 中生成的 getter 和 setter!框架的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中等效于在 c 编程中生成的要在 URL 查询字符串中发送的“Base64”编码的加密字节字符串

如何在 KMM(kotlin 本机)共享模块中读取 Swift 框架库中生成的对象数组

我们如何在 Visual Studio 中生成 getter 和 setter?

javascript 在Javascript中生成可覆盖的getter和setter

优化实体框架中生成的sql查询?

如何使用 Hyperledger Fabric 中生成的 ECDSA 私钥和公钥进行加密和解密