Java 框架,用于在运行时验证值(在运行时标识的类型)和条件(如何比较 2 个值)

Java Framework to validate values (Type identified at RunTime) and Condition (how to compare 2 values) at Run time

提问人:Manoj 提问时间:4/28/2023 更新时间:4/28/2023 访问量:24

问:

我目前正在用JAVA实现一个用例,如果有的话,我想寻求论坛的建议

问题陈述

我们想在运行时对 2 个值进行自定义比较

  1. 第一个值是从 DB 中检索的(始终为 String)
  2. 第二个值将从 File 中解析(始终为 String)

虽然在 String 中,但值可以是 Integer、Date、Float、Decimal 或 String.。这是从 DB 中的一列推断出来的 需要在 2 个值(例如,>=、<=、>、<)之间应用的条件在 DB 的一列中指定,并以字符串格式提供

但是,有没有更好的框架来处理这些问题??

可能的方法:

  1. 我们自己实现基于 java 代码中的 DataType 和 String 中的 Condition 进行比较的行为。但问题是有很多用例需要编码和测试。此外,每次添加新条件(如果未涵盖)都需要更改代码

import org.apache.commons.lang3.ObjectUtils;

import java.time.LocalDate;
import java.util.NoSuchElementException;

public enum Operation {

    EQUAL_DATE("EQUAL_DATE") {
        @Override
        public boolean apply(Object left, Object right) {
            //Local
            try {
                LocalDate leftDate = (LocalDate) left;
                LocalDate rightDate = (LocalDate) right;
                return leftDate.isEqual(rightDate);
            } catch (Exception e) {

            }
            return true;
        }
    },

    LESS_THAN_EQUAL_DATE("LESSTHANEQUAL_DATE") {
        @Override
        public boolean apply(Object left, Object right) {
            try {
                LocalDate leftDate = (LocalDate) left;
                LocalDate rightDate = (LocalDate) right;
                return leftDate.isBefore(rightDate) || leftDate.isEqual(rightDate);
            } catch (Exception e) {

            }
            return true;
        }
    },

    GREATER_THAN_EQUAL_DATE("GREATERTHANEQUAL_DATE") {
        @Override
        public boolean apply(Object left, Object right) {
            try {
                LocalDate leftDate = (LocalDate) left;
                LocalDate rightDate = (LocalDate) right;
                return leftDate.isEqual(rightDate) || leftDate.isAfter(rightDate);
            } catch (Exception e) {

            }
            return true;
        }
    },
    /**
     * for Data type agnostic checks ANY is appended
     */
    NOT_NULL_ANY("NOT_NULL_ANY") {
        @Override
        public boolean apply(Object left, Object right) {
            // here right doesn't matter, ignore it, always left parameter is the data from file
            return ObjectUtils.allNotNull(left);
        }
    };


    private final String operation;
    private Operation (String operation) {
        this.operation = operation;
    }

    public static Operation parseOperator(String operator) {
        for (Operation op : values()) {
            if (op.operation.equals(operator)) return op;
        }
        throw new NoSuchElementException(String.format("Unknown operator [%s]", operator));
    }
    public abstract boolean apply(Object left, Object right);
}

`

Java Spring 比较

评论


答: 暂无答案