我想验证一个 Java 类对象以检查成员是否遵守某些规则。除了特定规则外,我还想检查是否有任何字符串成员为空/空。
这样做的好方法是什么(验证字符串成员)?
我的做法是:
if(StringUtils.isNotEmpty(sMember1) && StringUtils.isNotEmpty(sMember2)...)
是否有一种简洁的方法来验证所有字符串成员?
(反射是一种可能性吗?如果是,它会是一个昂贵的操作吗?)
我想验证一个 Java 类对象以检查成员是否遵守某些规则。除了特定规则外,我还想检查是否有任何字符串成员为空/空。
这样做的好方法是什么(验证字符串成员)?
我的做法是:
if(StringUtils.isNotEmpty(sMember1) && StringUtils.isNotEmpty(sMember2)...)
是否有一种简洁的方法来验证所有字符串成员?
(反射是一种可能性吗?如果是,它会是一个昂贵的操作吗?)
您应该使用符合 jsr 303 的验证器。请参阅此讨论是否有可用的 JSR-303(bean 验证)实现?
正如@krishnakumarp 指出的那样,我还建议使用JSR 303,我不会构建自己的框架,而是使用任何已经可用的东西。但是,如果您想了解如何实现它,那么它实际上非常简单:
public static Collection<ErrorMessage> validate(Object obj) {
Collection<ErrorMessage> errors = new ArrayList<ErrorMessage>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getType().equals(String.class)) {
try {
String value = (String) field.get(obj);
if (isEmpty(value)) {
errors.add(new ErrorMessage(field.getName() + " is empty"));
}
}
catch (Exception e) {
// oops.
e.printStackTrace();
}
}
}
return errors;
}
请注意,在此示例中,有一个自定义错误处理,并且为每个验证错误ErrorMessage
创建一个对象。
为此有很多框架和库。看看http://oval.sourceforge.net/
为什么不考虑在使用同一对象的 setter 方法设置成员时检查成员的有效性?在对对象进行任何操作之前检查对象成员的有效性是很好的,但 IMO 最好在设置它们后立即进行验证。如果值不合适,允许操作(在核心类内部)向更高层抛出适当的异常。
注意:如果您不重构旧代码片段,但您正在编写新数据对象,则此方法是可行的。