Java - 设计验证器,类层次结构

时间:2013-01-14 12:00:23

标签: java inheritance validation class-hierarchy

我正在为某些对象(这些对象的字段)设计验证器。这些对象被包含在一个更大的对象 - 容器中。

示例:汽车作为容器。由车轮,发动机,车身组成。 假设我需要验证车轮是否具有正确的直径,发动机是否具有正确的容量,车身是否具有一定的长度等。

理论上我认为我应该在建造集装箱(汽车)之前验证一切。

实现这一目标的最佳方法是什么?我是否使用validate()方法创建一个抽象的验证器类并在每个封闭的类中实现它?容器怎么样,我在验证过程中根本不包含它?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

我建议你不要将验证逻辑放在你要验证的类中。

我发现最好将这些类保留为值对象,并创建验证器的并行层次结构,大约每个要验证的实体一个。或者,您也可以创建一个可以验证所有实体的验证器:但是,此解决方案的可扩展性较低,并且当您必须添加新实体时可能会违反open-closed principle(例如,您也想要处理用汽车的后视镜)。

假设您选择one entity : one validator方法,容器的验证器将首先验证容器内的组件,然后验证它们是否合在一起。

请考虑使用Apache Commons Validator等验证程序框架的可能性,这可以帮助您避免编写样板代码。但是,由于我不知道您必须执行什么样的复杂验证,我不知道它是否符合您的需求。

此外,我认为您不应该担心在构建之前验证所有内容。只需构建它并在之后进行验证:然后,如果它违反了验证规则,您可以将其丢弃(即不要将其保留在任何地方)。

答案 1 :(得分:1)

您可以使用validate方法创建一个ValidatablePart接口,让所有部件都实现此接口,然后让容器验证所有包含的部分,因为它们被添加到容器中,或者可能在调用容器的构建或任何方法时应该构建它。

您的Container类可以遵循Template Method Design Pattern

答案 2 :(得分:1)

小心退出gd1的回答,我同意。一种方法是为每个值对象提供ValidatorAdapter。所以它看起来像这样:

public class GreenCarValidator {
   public GreenCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      return car.getColor().equals("green");
   }
}

public class RedCarValidator {
   public RedCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      // you could compose more validators here for each property in the car object as needed
      return car.getColor().equals("red");
   }
}

现在,您可以为单一类型的对象提供多种类型的验证器,在运行时可动态和可配置。如果您将类中的“valid()”方法放在类中,而gd1建议您不这样做,那么您将失去这种灵活性。