Следует ли мне избегать использования аннотаций? - PullRequest
0 голосов
/ 04 мая 2020

В моем проекте я загружаю конфигурацию из файла json (используя gson), и, как вы, вероятно, знаете, пропущенные поля будут заполнены пустой строкой.

Некоторые поля являются обязательными и значение other должно быть больше X, и я хочу его проверить.

Простой (и уродливый) способ - использовать условие if для каждого свойства, например:

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

, но я иметь более одного поля, и в будущем будет добавлено все больше и больше свойств, поэтому я построил две аннотации, названные NorNullEmpty и GreaterThen (со свойством 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;
}

Когда я делал обзор кода с коллажем, он очень боялся использования аннотаций: «это очень рискованно и очень дорого стоит» ..

Я буду рад узнать, что вы думаете, если я использовать просто-тупо ли для каждого поля? продолжить с отражением? или я должен проверить поля другим способом?

Примечание: НЕ использовать Spring / Hibernate.

1 Ответ

4 голосов
/ 04 мая 2020

Прежде всего вы пытаетесь заново изобрести колесо. Существует проект под названием Hibernate Validator , который является реализацией справочной спецификации проверки компонентов.

Вот пример с их целевой страницы:

public class Car {

   @NotNull
   private String manufacturer;

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

   @Min(2)
   private int seatCount;

   // ...
}

Итак, вы определить валидации и запустить двигатель, он выполнит все проверки и вернет ошибки, если они есть. Вы даже можете свернуть свои собственные валидации, что делает его расширяемым.

Одно замечание: этот проект не имеет ничего общего с Hibernate (широко известным в мире инструментом отображения ORM java).

Этот проект также интегрируется с пружиной MVC, если вам нужно что-то подобное.

В любом случае, он использует подход аннотации и действительно имеет некоторое снижение производительности. Однако все зависит от того, какие данные у вас есть, например, они все еще намного быстрее, чем сетевые вызовы, поэтому, если ваш проект делает что-то подобное, возможно, дополнительные расходы будут незначительными.

Отражение не это медленно, как это было в первых Java версиях, но суть в том, что вы должны попробовать и сами убедиться, соответствует ли это вашим потребностям. В противном случае я могу только строить догадки.

Здесь вы можете найти учебник по этой теме c, должен иметь отношение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...