проверяйте аргументы конструктора или параметры метода с помощью аннотаций и позволяйте им автоматически генерировать исключение - PullRequest
2 голосов
/ 12 июня 2010

Я проверяю аргументы конструктора и метода, так как хочу, чтобы программное обеспечение, особенно его модель, быстро проваливалось.

В результате код конструктора часто выглядит следующим образом

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    if(arg1 == null) {
        throw new IllegalArgumentsException("arg1 must not be null");
    }
    // further validation of constraints...
    // actual constructor code...
}

Есть ли способ сделать это с помощью подхода, основанного на аннотациях? Что-то вроде:

public MyModelClass(@NotNull(raise=IllegalArgumentException.class, message="arg1 must not be null") String arg1, @NotNull(raise=IllegalArgumentException.class) String arg2, OtherModelClass otherModelInstance) {

    // actual constructor code...
}

В моих глазах это сделало бы реальный код намного более читабельным.

В понимании, существуют аннотации для поддержки проверки IDE (например, существующая аннотация @NotNull).

Большое спасибо за вашу помощь.

Ответы [ 2 ]

6 голосов
/ 14 ноября 2012

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

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    org.apache.commons.lang3.Validate.notNull(arg1, "arg1 must not be null");
    // further validation of constraints...
    // actual constructor code...
}
1 голос
/ 12 июня 2010

Такие структуры существуют (JSR-330), но, во-первых, я бы поспорил, что подход аннотации более читабелен. Что-то вроде этого мне показалось бы лучше:

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    Assert.notNull(arg1, "arg1 must not be null");
    // further validation of constraints...
    // actual constructor code...
}

где Assert.notNull - это статический метод где-то (и как указано в Spring или Commons Lang).

Но если вы уверены, что используете аннотации, взгляните на Hibernate Validator , который является эталонной реализацией API JSR-330. Это аннотации, подобные тем, которые вы описываете.

Проблема в том, что вам нужна структура для интерпретации этих аннотаций. Просто позвонить по номеру new MyModelClass() не получится без какой-либо магии загрузки классов под одеялом.

Подобные Spring могут использовать аннотации JSR-330 для проверки данных в моделях, поэтому вы можете взглянуть на это , но это может не подходить для вашей ситуации. , Нечто подобное будет необходимо, однако, аннотации являются не более чем украшением.

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