计算属性
也许能添加到您的应用程序中最简单的业务逻辑是计算属性。到目前为止,我們使用的属性都是持久性的,也就是每个属性都存储在数据库表的其中一列。计算属性是不将該值存储在数据库,而是在访问该属性时都会计算。請看持久属性和计算属性之间的区别。
// 持久属性
@Getter @Setter // 它的 getter 和 setter
int quantity; // 它有一个字段,所以是持久性的
// 计算属性
public int getAmount() { // 他没有字段也没有 setter,只有 getter
return quantity * price; // 里有计算
}
OpenXava 会自动识别计算属性。您可以在视图、表格列表或任何代码中使用它们。
我们将使用计算属性把 money 元素添加到我们的 invoicing 应用程序中。雖然我们有详细信息、产品和数量,但是金额怎麼辦呢?
简单的计算属性
第一步是在 Detail 中添加一个 amount 属性。我們想要的是,当用户选择产品并输入数量时,金额會自動計算并显示出來:
将此功能添加到代码中,实际上像是将计算属性添加到 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 属性的效果。