2

我有一些POJOs有一定的规则要遵守。A类型的ObjectA的状态取决于 B 类型的ObjectB状态。在这种情况下,我使用构建器在ObjectA上强制执行ObjectB的规则。

构建器负责执行所有验证、抛出异常并在构建ObjectA时执行检查。这不是问题。我希望将来的开发人员使用构建器来实例化和操作类型A 。我该如何执行?

以下是我的一些选择,这将是最好的方向:

  1. 文档,如果开发人员不阅读文档,则效果不佳,而且如果可以做某事,就会有人去做。
  2. 将验证移到 中POJO,但我使用ORM并且在设置属性时很少会引发错误。
  3. 你对这个问题的想法。
4

4 回答 4

2

使用静态内部构建器。

或者使构造函数受保护并将生成器放在具有公共接口的同一包中

于 2012-10-10T13:34:39.750 回答
1

我假设鉴于这些是 POJO,使构造函数小于 public 不是一种选择,因为这会导致 ORM 出现问题?

如果可以将构造函数设为非公开,可以将生成器设为 POJO 类的静态子类,并将构造函数设为私有,从而防止其他人直接实例化 POJO。

但是您至少应该能够使用@Deprecated注释来为使用 POJO 的构造函数提供警告。然后,您可以使用@SuppressWarnings("deprecation")执行实例化的 Builder 方法来获得干净的构建。

于 2012-10-10T13:34:30.687 回答
1

只要确保你的A类的构造函数不能被直接调用。制作它private并将构建器创建为可以访问构造函数的静态内部类。然后(可选)在 A 中创建一个方法

public static Builder builder() {
    return new Builder();
}

以方便的方式访问构建器。您还可以将外部依赖项(如 B)传递给此方法。

于 2012-10-10T13:35:36.377 回答
1

BuilderObjectAObjectB放在同一个包中。然后使构造函数为ObjectAObjectB保护。这样,建造者是唯一可以创造它们的人。

于 2012-10-10T13:47:34.187 回答