Sil*_*ier 7 java validation factory guice
我正在编写一个新的应用程序,使用Guice进行依赖注入,以及Guava的属性验证前置条件.
我正在使用工厂模式根据外部输入创建bean.问题是,验证输入的首选方法是什么?(在可维护性,清晰度等方面)
我们假设这些类:
Bean.java
public interface Bean {
public Object getFoo();
}
Run Code Online (Sandbox Code Playgroud)
BeanImpl.java
public class BeanImpl implements Bean {
private final Object foo;
public BeanImpl(Object param) {
foo = param;
}
@Override
public String getFoo() {
return foo;
}
}
Run Code Online (Sandbox Code Playgroud)
我想检查"param"是否包含"foo"的有效值:
Preconditions.checkArgument(SomeValidator.isValid(param), "Bad param: %s!", param);
Run Code Online (Sandbox Code Playgroud)
我应该在哪里做,为什么?
BeanImpl如果使用特定值构造 a 是无效的foo,则IllegalArgumentException在构造函数中抛出一个 ,详细说明错误所在。
public class BeanImpl {
...
public BeanImpl(Object param) {
if (param == null) {
throw new IllegalArgumentException("Param cannot be null");
}
foo = param;
}
...
}
Run Code Online (Sandbox Code Playgroud)
从对象的早期定义来看,“状态和行为相结合”这强制您不会用无效状态污染对象。
就工厂而言,在构造对象之前检查值很方便,但工厂的真正职责并不延伸到对象的职责。工厂模式有助于确保对象以有意义的方式与其他对象相对应,但它不应该完成对象的工作,即确保对象的内部状态正确。
让一个对象(工厂)确保另一个对象的状态正确是错误的行为。您将行为(验证状态)放在工厂中,但状态位于对象中。因此,您现在拥有了应该紧密耦合的分散连接代码。这意味着现在你必须有一个工厂来制作一个对象,而不是在有意义的时候让工厂制作一个对象,在没有意义的时候直接制作对象。
这通常出现在单元测试中。如果工厂没有放入验证码,则可以独立对Object进行单元测试;测试不良参数。但是,如果将验证代码放入工厂中,则没有工厂就无法构造“有效”对象,这是您将得到的第一个提示,即您已经不自然地耦合了两个不应该紧密耦合在一起的对象。
当然,也有例外; 但当人们期望数据正确,但收集数据的方式无法提供验证时,它们往往就会出现。例如,从网络套接字收集的结构化记录实际上可能具有概念上不一致的数据;但是,由于处理的性质,无效输入会被处理、记录和丢弃。
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |