我有一个包含以下元素的类:
public class Details {
private String locale;
private String url;
.
.
.
}
现在从我的客户端收到一份清单。我想对这些元素进行一些验证。但是,没有必要提供所有元素(null是可接受的)。
List<Details> detailsList;
Validate.notNull(detailsList);
for(Details details: detailsList) {
if(details.getLocale() != null) {
Validate.isTrue(StringUtils.isNotBlank(LocaleUtils.toLocale(details.getLocale()).getVariant()));
}
if(details.getUrl() != null) {
Validate.isTrue(urlValidator.isValid(details.getUrl()));
}
//Similarly perform null checks and then do the validation.
}
有没有更好的方法来编写此验证而不是为每个字段编写空检查?
答案 0 :(得分:0)
只需从代码中获取Locale
示例,我理解的是:
Locale
这使得&#34; nullness&#34;部分验证标准,因此您可以简单地添加== null || <valid>
表达式。例如:
Validate.isTrue(details.getLocale() == null || StringUtils.isNotBlank(...));
使用新的Java 8 Optional<>
类,可以进一步选择语法来明确您的意图。以下代码说明了这一点。选择你的偏好。
import org.apache.commons.lang3.*;
public class OptionalTest {
public static class TestObject1 {
String locale;
public TestObject1(String locale) {
this.locale = locale;
}
}
public static class TestObject2 {
Optional<String> locale;
public TestObject2(String locale) {
this.locale = Optional.ofNullable(locale);
}
}
public static void main(String[] args) {
validate1(new TestObject1("en_GB_EURO"));
validate1(new TestObject1(null));
validate2(new TestObject2("en_GB_EURO"));
validate2(new TestObject2(null));
validate3(new TestObject2("en_GB_EURO"));
validate3(new TestObject2(null));
}
private static void validate1(TestObject1 to) {
Validate.isTrue(to.locale == null || StringUtils.isNotBlank(LocaleUtils.toLocale(to.locale).getVariant()));
}
private static void validate2(TestObject2 to) {
Validate.isTrue(!to.locale.isPresent() || StringUtils.isNotBlank(LocaleUtils.toLocale(to.locale.get()).getVariant()));
}
private static void validate3(TestObject2 to) {
to.locale.ifPresent(loc -> {
Validate.isTrue(StringUtils.isNotBlank(LocaleUtils.toLocale(loc).getVariant()));
});
}
}