Java中的简单对象验证

时间:2011-07-14 14:19:09

标签: java validation

我想知道,对象验证的最佳做法是什么。对案例一或案例二有任何额外的争论吗?还有另一种方式吗?

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

案例一

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 }
}

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果你真的只进行1次字段验证,那么情况2就更好了,因为很明显对象有什么问题。

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

答案 4 :(得分:0)

我认为您可以设计此代码的另一种方法是使用面向方面编程。您添加的验证代码是某种令您担忧的业务代码。如果使用方面,则可以避免使用验证代码污染代码。您可以参考本文http://www.developer.com/java/5-reasons-java-developers-should-learn-and-use-aspectj.html,其中显示了使用Aspects进行验证的用例。