工厂模式:创建bean时验证输入(Guice / Guava)

我正在编写一个新的应用程序,使用Guice进行依赖注入,以及番石榴的属性验证前提条件。

我使用工厂模式根据外部输入创建bean。 问题是, 验证输入的首选方法什么? (就可维护性,清晰度等而言)

我们假设这些类:

Bean.java

public interface Bean {

    public Object getFoo();

}

BeanImpl.java

public class BeanImpl implements Bean {

    private final Object foo;

    public BeanImpl(Object param) {
        foo = param;
    }

    @Override
    public String getFoo() {
        return foo;
    }

}

我想检查“param”是否包含“foo”的有效值:

Preconditions.checkArgument(SomeValidator.isValid(param), "Bad param: %s!", param);

我应该在哪里做,为什么?

  • 在BeanImpl的构造函数中? (我不确定为什么,但在构造函数中添加检查似乎是一个坏主意。)
  • 在调用BeanFactory.create(param)之前? (听起来像可怕的代码重复。)
  • 通过一些Guice机制我不知道?

  • 如果使用特定的foo值构造一个BeanImpl是无效的,那么在构造函数中抛出IllegalArgumentException ,详细说明什么是错误的。

    public class BeanImpl {
      ...
      public BeanImpl(Object param) {
        if (param == null) {
          throw new IllegalArgumentException("Param cannot be null");
        }
        foo = param;
      }
      ...
    }
    

    从“状态和行为相结合”的对象的早期定义来看,这强制了你不会以无效状态污染你的对象。

    就工厂而言,在构造对象之前检查值是一种方便,但工厂的真正责任不会延伸到对象的责任。 工厂模式有利于确保Object以有意义的方式与其他对象相对应,但它不应该执行Object确保Object的内部状态正确的工作。

    让一个对象(工厂)确保另一个对象的状态是正确的是错误的行为。 您将行为(验证状态)置于Factory中,但状态位于Object中。 因此,您现在已经分散了应该紧密耦合的连接代码。 这意味着现在你必须有一个工厂来创建一个对象,而不是让工厂在有意义时创建一个对象,并在没有时直接创建该对象。

    这通常在单元测试中出现。 如果您没有将验证码放入工厂,您可以单独测试该对象; 测试不良参数。 但是,如果您将验证代码放入工厂中,则无法在没有工厂的情况下构建“有效”对象,这是第一个提示,即您将两个不应该紧密耦合在一起的对象非自然耦合在一起。

    当然,也有例外; 但是当他们希望数据是正确的时候,他们往往会出现,但是收集数据的方式并没有提供验证。 例如,从网络套接字收集的结构化记录实际上可能具有概念上内部不一致的数据; 但是,由于处理的性质,处理,记录和丢弃无效输入。


    查看Netflix的Guvernator框架:

    https://github.com/Netflix/governator/wiki/Field-Validation

    它基于Google Guice构建,并通过一些很酷的功能扩展它

  • 生命周期(建设,验证,热身,摧毁)
  • 验证
  • 组态
  • 在你的项目中包含更多的锅炉板,但绝对值得尝试。

    链接地址: http://www.djcxy.com/p/25615.html

    上一篇: Factory pattern: Validating input when creating a bean (Guice/Guava)

    下一篇: Xcode 6.3 builds all swift files twice