我有一些POJOs
要遵守某些规则。 A 类型的 ObjectA 的状态取决于 B 类型的 ObjectB 的状态。在这种情况下,我使用构建器在 ObjectA 上强制执行 ObjectB 的规则。
构建器 ObjectA 时,构建器负责执行所有验证,抛出异常并执行检查。这不是问题。我希望将来的开发人员使用构建器实例化和操作类型 A 。我该如何强制执行此操作?
以下是我的一些选择,这是最佳方向:
POJO
,但我使用 ORM ,并且很少在设置属性时抛出错误。答案 0 :(得分:2)
使用静态内部构建器。
或者使构造函数受到保护,并将构建器放在具有公共接口的相同包中
答案 1 :(得分:1)
我认为鉴于这些是POJO,使得构造函数小于公共不是一个选项,因为这会导致ORM的问题?
如果构造函数非公共是的可能性,您可以使构建器成为POJO类的静态子类,并使构造函数成为私有,从而防止其他人直接实例化POJO。
但是你应该能够至少使用@Deprecated
注释来提供使用POJO构造函数的警告。然后,您可以在执行实例化的Builder方法上使用@SuppressWarnings("deprecation")
来获得干净的构建。
答案 2 :(得分:1)
确保无法直接调用A类的构造函数。将其设为private
并将构建器创建为可以访问构造函数的静态内部类。然后(可选)在A方法中创建
public static Builder builder() {
return new Builder();
}
以方便的方式访问构建器。您还可以将外部依赖项(如B)传递给此方法。
答案 3 :(得分:1)
将Builder
,ObjectA
和ObjectB
放在同一个包中。然后使ObjectA
和ObjectB
的构造函数受到保护。这样,构建器是唯一可以创建它们的构建器。