我应该避免使用注释吗?

问题描述 投票:0回答:1

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

有些字段是强制性的,而其他字段必须大于X,我想验证它。

简单(也很丑陋)的方法是对每个属性使用if条件,比如。

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

但是,我有不止一个字段,而且将来会添加越来越多的属性,因此我建立了两个注解,叫做 NorNullEmptyGreaterThen (带value属性),我运行抛出这样的字段。

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。

java validation reflection annotations
1个回答
4
投票

首先,你正在试图重新发明轮子。Hibernate验证器 的实现,它是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版本那么慢,但底线是你应该自己尝试一下,看看它是否适合你的需求。否则我只能猜测。

这里是 你可以找一个关于这个主题的教程,应该是相关的。

© www.soinside.com 2019 - 2024. All rights reserved.