【问题标题】:Simple Object Validation in JavaJava中的简单对象验证
【发布时间】:2011-07-14 14:19:08
【问题描述】:

我想知道,什么是对象验证的最佳实践。对案例一或案例二是否有任何额外的论据?还有其他方法吗?

我不搜索任何验证库,我只是想做简单的验证。

案例一

class A {
   public void doSomething(MyObject o) {
      try {
         validate(o);
         doSomethingUseful(o);
      } catch (ValidationException e) {
         Logger.getLogger().warn(e);
      }
   }

   private void validate(MyObject o) throws ValidationException
   { 
      if (o.getXYZ() == null) 
         throw new ValidationException("Field XYZ cannot be null");
   }

   private void doSomethingUseful(MyObject o) { //some funny stuff }
}

案例二

class A {
   public void doSomething(MyObject o) {
      if (validate(o)) {
         doSomethingUseful(o);
      } else
         Logger.getLogger().warn("Object is invalid");
      }
   }

   private boolean validate(MyObject o)
   { 
      if (o.getXYZ() == null) return false;
      return true;
   }

   private void doSomethingUseful(MyObject o) { //some funny stuff }
}

【问题讨论】:

  • 这里没有强烈的偏好。也许更重要的是,您可以在同一个对象上捕获多个验证缺陷,这样用户就不必一遍又一遍地尝试查看下一个缺陷是什么。
  • 如果您使用布尔值,为什么在案例 2 上进行验证有 throws ValidationException
  • @Damokles 可能是复制粘贴
  • @Damokles:错字,抱歉。我现在修好了...

标签: java validation


【解决方案1】:

如果您只是吞下异常并且验证方法只是私有的,那么更喜欢case two,因为您不应该将异常用于正常逻辑。

如果您想让客户端处理您应该处理的异常,请使用case one,但让它抛出而不是吞下。

【讨论】:

    【解决方案2】:

    Here 是 Joel Spolsky 的一篇很棒的文章,值得考虑阅读。就个人而言,我更喜欢第二种情况。处理异常可能会变得混乱 IMO。

    【讨论】:

    • 不错的分享!文章
    【解决方案3】:

    如果你真的只做 1 个字段验证,那么案例 2 更好,因为很清楚对象有什么问题。

    如果您需要有关验证错误的更多信息,或者如果您需要传递多个验证错误,那么您可以使用异常对象作为传递该附加信息的容器。

    【讨论】:

      【解决方案4】:

      在第二种情况下,方法validate 永远不会抛出ValidationException,所以如果你想管理多个异常(null,错误格式,...),我建议你使用第一个一个,这样您就可以返回一个清晰而有用的错误消息。

      【讨论】:

        【解决方案5】:

        我认为您可以设计此代码的另一种方法是使用面向方面的编程。您添加的验证代码是某种会破坏您的业务代码的问题。如果您使用方面,您可以避免使用验证码污染您的代码。您可以参考这篇文章http://www.developer.com/java/5-reasons-java-developers-should-learn-and-use-aspectj.html,它展示了使用 Aspects 进行验证的用例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-02
          • 1970-01-01
          相关资源
          最近更新 更多