Java 在验证DTO中的字段时,如何避免重复的if-else?
StudentDTO类有大约20个字符串属性,每个属性都需要根据下面注释中给出的逻辑验证是否为强制属性。这将使更新方法变得冗长,包含太多if-else。异常消息应根据属性更改。这段代码使用Java11Java 在验证DTO中的字段时,如何避免重复的if-else?,java,lambda,Java,Lambda,StudentDTO类有大约20个字符串属性,每个属性都需要根据下面注释中给出的逻辑验证是否为强制属性。这将使更新方法变得冗长,包含太多if-else。异常消息应根据属性更改。这段代码使用Java11 // all fields except lastUpdated are string public Student populateStudent(final StudentDTO studentDTO) { Student student = new Studen
// all fields except lastUpdated are string
public Student populateStudent(final StudentDTO studentDTO) {
Student student = new Student();
boolean dataUpdated = false;
/*
If mandatory parameter is:
1.) null : parameter is not updating
2.) empty : validate and throw an exception
3.) blank : validate and throw an exception
*/
if (isEmptyOrBlank(studentDTO.getName())) {
handleBadParam("Bad student name");
} else {
if (studentDTO.getName() != null) {
student.setName(studentDTO.getName());
dataUpdated = true;
}
}
if (isEmptyOrBlank(studentDTO.getBirthday())) {
handleBadParam("Bad student birthday");
} else {
if (studentDTO.getBirthday() != null) {
student.setBirthday(studentDTO.getBirthday());
dataUpdated = true;
}
}
// .... 20 other similar if-else statements later ....
// if atleast one parameter updated then date should update
if (dataUpdated) {
student.setLastUpdated(new Date());
}
return student;
}
private boolean isEmptyOrBlank(String name) {
return name != null && (name.isEmpty() || isBlank(name));
}
private void handleBadParam(String messgae) {
throw new IllegalArgumentException(messgae);
}
private boolean isBlank(String name) {
return (name.trim().length() == 0);
}
似乎您正在验证您的对象 我不会分享任何代码示例,我只会分享一个设计意见。顺便说一下,在设计应用程序时,您应该遵循设计原则。这也是普遍接受的,你可以在设计应用程序时将这些原则应用到你的应用程序中 您可以创建一个类,如
StudentValidator
,因此它的工作必须仅验证Student
对象。所以你们认识到了solid单一责任的第一条原则
另外,StudentValidator类将具有您需要的验证方法。在所有这些实现之后,您可以为每个验证使用一个方法,或者在需要时调用它们
还有许多设计模式可以通过实现模式避免
if-else
语句。与命令模式类似,使用枚举等。我强烈建议使用Java环境JSR303bean验证。javax.Validation包为开发人员提供了一种标准化的方法。必须满足某些条件的字段接收相应的注释,例如@NotNull,然后由框架对这些注释进行评估。当然,为了检查更具体的条件,可以创建自定义注释和验证器
你可以参考这个。我只能看到一个
if
-else
name.isEmpty()| name.isEmpty()
?我认为这是一个试图做太多事情的方法的例子。为什么更新方法尝试验证每个字段?您应该将数据验证提取到一个或多个其他方法中。您可以使用反射和(对于更多控制)注释来完成此操作。例如,这允许您在DTO类中循环所有名为getSomething
的方法,在循环中的单个if-else中执行此逻辑,并为目标类上的每个方法调用“set”+Someting
@Lino是的,它既是有效代码又是有效代码:来自自定义异常消息的PApart,似乎逻辑可以是像return Optional.of(studentDTO).filter(a->isnotemptyorbank(a.getName()).filter(a->isnotemptyorbank(a.getbirth()).map(a->newstudent(a.getName()),a.getBirthday(),System.currentTimeMillis()).OrelsThrow(IllegalArgumentException::new)使用要添加到其中的utilprivate boolean isNotEmptyOrBlank(字符串名称){返回名称!=null&&&!name.isEmpty()&&name.trim().length()!=0;}
属性值可以为null,但不能为空或为空。Bean验证程序NotEmpty和NotBlank在内部检查可空性。所以它不能在这里使用。