假设我们有Foo类,其属性为FirstProp,SecondProp和ThirdProp。 业务方面,SecondProp中允许的值取决于为FirstProp设置的值,而ThirdProp的允许值取决于FirstProp和SecondProp的值。 把这个逻辑放在哪里最适合?
如果它位于每个属性的setter中,那么类用户可能会在其他两个属性之前设置ThirdProp,那么我们是否还需要强制设置属性的顺序呢?这似乎不是最佳的。另外,如果我们要将对象的初始化限制为parmererized构造函数,那么在我们将对象设计为值类型(struct)的情况下这是不实际的,因为结构中的默认构造函数始终可用。
任何意见都表示赞赏。
答案 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(如果在属性之前使用它们)设置正确。