繁体   English   中英

我应该避免使用注释吗?

[英]Should I avoid using 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;
}

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

我很高兴知道你的想法,我应该为每个字段使用一个简单的 if 吗? 继续反思? 或者我应该使用其他方式验证字段?

注意:不使用 Spring / Hibernate。

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

以下是他们登陆页面的示例:

public class Car {

   @NotNull
   private String manufacturer;

   @NotNull
   @Size(min = 2, max = 14)
   private String licensePlate;

   @Min(2)
   private int seatCount;

   // ...
}

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

附注 - 这个项目与 Hibernate (在 java 世界 ORM 映射工具中众所周知)没有任何共同之处。

如果您需要类似的东西,该项目还与 spring MVC 集成。

无论如何,它确实使用了注释方法,并且确实有一些性能损失。 然而这一切都取决于你有什么样的数据,例如它仍然比网络调用快得多,所以如果你的项目做这样的事情,额外的成本可能可以忽略不计。

反射并不像以前在第一个 Java 版本中那么慢,但最重要的是,您应该尝试看看它是否符合您的需求。 否则我只能推测。

Here你可以找到关于这个主题的教程,应该是相关的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM