我应该避免使用注释吗?

时间:2020-05-04 05:07:44

标签: java validation reflection annotations

在我的项目中,我正在从json文件(使用gson)加载配置,并且您可能知道,缺少的字段将填充一个空字符串。

某些字段是必填字段,其他字段必须大于X,我想对其进行验证。

简单(难看)的方法是对每个属性使用if条件,例如:

if (StringUtils.isEmpty(sftpConfiguration.getHostName)) {
   logger.error (“hostName property is mandatory”);
  // etc.
}

但是,我有多个字段,将来还会添加越来越多的属性,因此我构建了两个名为NorNullEmptyGreaterThen(具有value属性)的注释,然后运行throw像这样的字段:

public static boolean validateWithAnnotation(Object object) throws IllegalAccessException {
    boolean result = true;
    Field[] classFields = object.getClass().getDeclaredFields();

    for (Field field : classFields) {
        if (field.getAnnotation(NorNullEmpty.class) != null) {
            if (field.getType() == String.class) {
                field.setAccessible(true);
                String value = (String) field.get(object);
                if (StringUtils.isEmpty(value)) {
                    result = false;
                    logger.error("Property {} is mandatory but null or an empty.", field.getName());
                }
                field.setAccessible(false);
            } else {
                logger.warn("@NorNullEmpty annotation is working on String type only.");
            }
        } else if (field.getAnnotation(GreaterThan.class) != null) {
            Class<?> fieldType = field.getType();
            if (fieldType == long.class || fieldType == Long.class) {
                field.setAccessible(true);
                Long val = field.getLong(object);
                if (val <= field.getAnnotation(GreaterThan.class).value()) {
                    result = false;
                    logger.error("Property {} value is {} and it must be greater than {}.", field.getName(), val, field.getAnnotation(GreaterThan.class).value());
                }
                field.setAccessible(false);
            }
        }
    }

    return result;
}

当我使用拼贴进行代码审查时,他非常害怕注释的使用,“这是非常危险且非常昂贵的成本”。

很高兴知道您的想法,如果在每个字段中都应该使用简单愚蠢的方法?继续反思?还是我应该使用其他方式来验证字段?

注意:不使用Spring / Hibernate。

1 个答案:

答案 0 :(得分:4)

首先,您要重新发明轮子。 有一个名为Hibernate Validator的项目,它是bean验证参考规范的实现。

以下是其着陆页中的一个示例:

      let booking_start_date = document.getElementById("booking-summary-start-date");
      let booking_end_date = document.getElementById("booking-summary-end-date");

      booking_start_date.remove();
      booking_end_date.remove();

      let booking_start_date_container = document.getElementById("booking-sum-start-new");
      let booking_end_date_container = document.getElementById("booking-sum-end-new");

      booking_start_date_container.append(`<span id="booking-summary-start-date">${start_date}</span>`);
      booking_end_date_container.append(`<span id="booking-summary-end-date">${end_date}</span>`);

因此,您定义验证并运行引擎,它将执行所有检查并返回错误(如果有)。您甚至可以滚动自己的验证,从而使其可扩展。

一个旁注-这个项目与Hibernate(Java世界ORM映射工具中众所周知的)没有什么共同之处。

如果您需要这样的项目,则该项目还可以与spring MVC集成。

无论如何,它确实使用了注释方法,并且确实会降低性能。但是,这完全取决于您拥有的数据类型,例如,它仍然比进行网络调用要快得多,因此,如果您的项目执行了类似的操作,则可能会忽略不计的额外费用。

反射不像以前的Java版本那样慢,但是最重要的是,您应该尝试看看自己是否适合您的需求。否则我只能推测。

Here,您可以找到与此主题相关的教程

相关问题