最适合对象状态验证的地方

时间:2012-02-06 03:44:56

标签: oop

假设我们有Foo类,其属性为FirstProp,SecondProp和ThirdProp。 业务方面,SecondProp中允许的值取决于为FirstProp设置的值,而ThirdProp的允许值取决于FirstProp和SecondProp的值。 把这个逻辑放在哪里最适合?

如果它位于每个属性的setter中,那么类用户可能会在其他两个属性之前设置ThirdProp,那么我们是否还需要强制设置属性的顺序呢?这似乎不是最佳的。另外,如果我们要将对象的初始化限制为parmererized构造函数,那么在我们将对象设计为值类型(struct)的情况下这是不实际的,因为结构中的默认构造函数始终可用。

任何意见都表示赞赏。

3 个答案:

答案 0 :(得分:0)

就个人而言,我会将Foo保留为纯java bean。这有许多好处,一开始可能并不明显。其中一个是当你将这个对象读取/持久化到数据库时(如果有的话),你需要/想要一个简单的setter。

相反,创建一个Foo的子类,其中包含业务逻辑。这会将您的代码分成持久层和域/业务对象层。

答案 1 :(得分:0)

我更希望使Foo成为一个不可变的值对象,并在静态工厂中进行所有必要的检查。

final class Foo {
  private final SomeObject first;
  private final SomeObject second;
  private final SomeObject third;

  private Foo(SomeObject first, SomeObject second, SomeObject third) {
    this.first = first;
    this.second = second;
    this.third = third;
  }

  /* Simple Getters + equals and hashCode if necessary */

  public static Foo newInstance(SomeObject first, SomeObject second, SomeObject third) {
     if ( ! /* your condition holds */ )
        throw new IllegalArgumentException();

     return new Foo(...);
  }
}

答案 2 :(得分:0)

我将在validate()方法中对属性验证进行分组,该方法可以在使用对象之前进行外部调用(如果正确初始化则返回true),或者在任何getter中抛出InvalidObjectStateException(如果在属性之前使用它们)设置正确。