您已将域模型转换为功能齐全的 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 注解,因为当您有“互相引用“时它会产生无限循环,这在业务应用程序中很常见。