使用构建器模式进行对象验证

Object validation using builder pattern

假设我有一个对象 Foo。我还有一个 FooBuilder 用于构造 Foo 对象。我应该在何时何地验证 Foo 对象的数据?

Foo foo = new FooBuilder()
    .withX("specific data for X")
    .withY("specific data for Y")
    .build();

让我们添加到等式中,验证可能包含例如数据库中的查找。构建器是否应该在构建方法中执行验证?或者 foo 对象中应该有一个特定的验证方法吗?或者验证最好从 Foo 对象和 FooBuilder 中完全抽象出来?

理想情况下,根本不可能创建无效的 Foo 对象。因此在 Foo 中使用验证方法不是最佳选择。

验证应尽早完成。这可能在 build() 方法中,或者 - 如果可能的话 - 甚至更早地在构建器的 setter 方法中。

如果您应该将验证器的实际实现放入构建器或单独的 class 中,则取决于它的复杂性。如果它需要像您提到的数据库查找之类的东西,那么创建一个单独的验证可能是有意义的 class.

我想补充一点,构建器有时被认为是一种反模式,表明 class 可能太复杂了,应该拆分成多个更小的 classes。