openxava / 文档 / 第九章:Java 属性

课程: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

目录

第九章:Java 属性
概念
总结
您已将域模型转换为功能齐全的 Web 应用程序。尽管这个应用程序已经非常有用,但您仍然可以进行许多优化。所以让我们一起把此应用程序变的严肃点,顺便学习一此关于 OpenXava 有趣的东西。
我们从一些基本的 Java 概念开始学习,例如属性。


概念

为了在本章更好地理解一些概念,您必须了解属性在 Java 中是如何工作的。在 Java 中定义一个属性的标准方法是:
// 属性(Property)
      
private int quantity; // 有一个字段

public int getQuantity() { // 一个Getter来返回字段的值(读取变量值)
    return quantity;
}

public void setQuantity(int quantity) { // 一个Setter来改变字段值(更新变量值)
    this.quantity = quantity;
}
这是基于您不应该能直接访问对象的状态(字段),而是通过调用方法。这非常有用,因为您可以在不更改代码下,改变一个属性的实现。此外,Java 生态系统的所有工具、框架和库都依赖于这个规范(JavaBeans 规范的一部分)。因此,我们应该始终使用这个规范。在 Java 里,一个可修改的属性是一个 getter 方法(例如 getQuantity())和一个 setter 方法(setQuantity(int quantity))。其实,这个情况是不需要 "private int quantity;" 这个字段的。
不过这样也有问题,在于代码会变的非常长,都是不会增加价值的 getter 和 setter。为了解决这个问题,我们使用了一个名为 Lombok 的库。通过 Lombok,可以用以下方式定义 quantity 属性:
@Getter @Setter // 它会生成一个getter和setter的方法
int quantity; 
@Getter 和 @Setter 会在编译后的代码中生成 getter 和 setter,所以当你访问属性时你必须使用它们,像这样:
int q = theObject.getQuantity(); // 永远不要 int q = theObject.quantity 
theObject.setQuantity(q + 10); // 也不要 theObject.quantity = q + 10;      
您可以在类级别中声明 @Getter 和 @Setter,这样所有字段自然具有 getter 和 setter。当然,如果你想使用自己的逻辑也可以编写自己的 setter 和 getter:
// @Data // 永远别用 @Data
@Getter @Setter
public class Issue {

    int number;
    String description;
	
    public String getDescription() { // 您自已编写的 getter 会覆盖 Lombok 生成的 getter
        if (description == null) return "No description yet";
        return description;
    }

}
在这种情况下,Lombok 会为您生成 getNumber()、setNumber() 和 setDescription(),而 getDescription() 是您编写的。请注意!您永远不该使用 Lombok 的 @Data 注解,因为当您有“互相引用“时它会产生无限循环,这在业务应用程序中很常见。

总结

在本章中,您学到了一些在实体添加业务逻辑的常用方法。也看到了 Lombok 库是如何运作的,如何手动定义 getter 和 setter 以便为我们的应用程序建立自定义的逻辑。

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