受益于 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?