openxava / 文档 / 第十章:计算属性

课程:1. 入门教学 | 2. 基本域模型(上) | 3. 基本域模型(下) | 4. 优化用户界面 | 5. 敏捷开发 | 6. 映射式超类继承 | 7. 实体继承 | 8. 视图继承(View) | 9. Java 属性 | 10. 计算属性 | 11. 用在集合的 @DefaultValueCalculator | 12. @Calculation 和集合总计 | 13. 从外部文件的 @DefaultValueCalculator | 14. 手动更改 schema | 15. 多用户时默认值的计算 | 16. 同步持久属性和计算属性 | 17. 从数据库中的逻辑 | 18. 使用 @EntityValidator 进行验证 | 19. 验证替代方案 | 20. 删除时验证 | 21. 自定义 Bean Validation 注解 | 22. 在验证中调用 REST 服务 | 23. 注解中的属性 | 24. 改进标准行为 | 25. 行为与业务逻辑 | 26. 参照与集合 | A. Architecture & philosophy | B. Java Persistence API | C. Annotations | D. Automated testing

目录

第十章:计算属性
计算属性
简单的计算属性
总结
我们通过 getter 和 setter 建立了业务逻辑,也看到如何使用 Lombok 库及其适用性,现在我们将看到如何在我們的應用程序中使用其它種属性。

计算属性

也许能添加到您的应用程序中最简单的业务逻辑是计算属性。到目前为止,我們使用的属性都是持久性的,也就是每个属性都存储在数据库表的其中一列。计算属性是不将該值存储在数据库,而是在访问该属性时都会计算。請看持久属性和计算属性之间的区别。
// 持久属性
@Getter @Setter // 它的 getter 和 setter
int quantity; // 它有一个字段,所以是持久性的
 
// 计算属性
public int getAmount() { // 他没有字段也没有 setter,只有 getter
    return quantity * price; // 里有计算
}
OpenXava 会自动识别计算属性。您可以在视图、表格列表或任何代码中使用它们。
我们将使用计算属性把 money 元素添加到我们的 invoicing 应用程序中。雖然我们有详细信息、产品和数量,但是金额怎麼辦呢?

简单的计算属性

第一步是在 Detail 中添加一个 amount 属性。我們想要的是,当用户选择产品并输入数量时,金额會自動計算并显示出來:

business-logic_en010.png

将此功能添加到代码中,实际上像是将计算属性添加到 Detail。請将以下代码添加到 Detail 类中:
@Stereotype("MONEY")
@Depends("product.number, quantity")  // 当用户改变数量或产品时
public BigDecimal getAmount() { // 此属性会重新计算并显示
    if (product == null || product.getPrice() == null) return BigDecimal.ZERO;
    return new BigDecimal(quantity).multiply(product.getPrice()); 
}
只需将计算放入 getAmount() 中并使用 @Depends 向 OpenXava 指示 amount 属性值取决于 product.number 和 quantity,因此每次用户更改这些值中的任何一个时,都会重新计算该属性。要注意的是,在这种情况,我们使用 product 而不是 getProduct(),quantity 而不是 getQuantity(),因为您可以在同一個类直接访问其字段。
现在您必须将這新属性添加到 CommercialDocument 的详细信息集合中:
@ElementCollection
@ListProperties("product.number, product.description, quantity, amount") // 添加 ammount
Collection<Detail> details;
没了,仅需添加 getter 和修改列表的属性就足够了。現在您可以使用 Invoice 和 Order 模块来查看使用 amount 属性的效果。

总结

在本章,您学到了如何使用计算属性,以及它们与持久属性的区别。在接下來的课程中,我们将學如何使用集合和总计。

下载本课源代码

对这节课有什么问题吗? 前往论譠 一切都顺利吗? 前往第十一章