Java 在验证DTO中的字段时,如何避免重复的if-else?

Java 在验证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

StudentDTO类有大约20个字符串属性,每个属性都需要根据下面注释中给出的逻辑验证是否为强制属性。这将使更新方法变得冗长,包含太多if-else。异常消息应根据属性更改。这段代码使用Java11

  // 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)private boolean isNotEmptyOrBlank(字符串名称){返回名称!=null&&&!name.isEmpty()&&name.trim().length()!=0;}
属性值可以为null,但不能为空或为空。Bean验证程序NotEmpty和NotBlank在内部检查可空性。所以它不能在这里使用。