Ненулевые локальные переменные - PullRequest
1 голос
/ 23 января 2020

Есть ли способ использовать @NonNull для локальных переменных в Java? Я использую Spring с @NonNullApi и @NonNullFields, аннотированными в package-info.java, но я не получаю те же предупреждения в своей IDE для локальных переменных, что и для полей, методов и параметров.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Чтобы получить поведение, которое я искал, я создал аннотацию и удалил @NonNullFields и @NonNullApi.

Вот аннотация, которую я использовал:

    import javax.annotation.Nonnull;
    import javax.annotation.meta.TypeQualifierDefault;
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;

    /**
     * This annotation can be applied to a package, class or method to indicate that the class fields,
     * method return types and parameters in that element are not null by default unless there is:
     * The method overrides a method in a superclass (in which
     * case the annotation of the corresponding parameter in the superclass applies) there is a
     * default parameter annotation applied to a more tightly nested element.
     */
    @Documented
    @Nonnull
    @TypeQualifierDefault(
            {
                    ElementType.ANNOTATION_TYPE,
                    ElementType.CONSTRUCTOR,
                    ElementType.FIELD,
                    ElementType.LOCAL_VARIABLE,
                    ElementType.METHOD,
                    ElementType.PACKAGE,
                    ElementType.PARAMETER,
                    ElementType.TYPE
            })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface NonNullByDefault {

    }
0 голосов
/ 30 января 2020

Не совсем. Вы можете сделать вашу переменную final. Это приведет к тому, что ему не будет разрешено быть null, но это функция времени компиляции, а не проверка параметров во время выполнения, так что это две разные концепции. Kotlin имеет концепцию Nullable , но в Java есть только действительно Optional, что не совпадает.

Если вы хотите добавить проверку параметров запроса в функции и / или переменные во время выполнения, это классический c пример Aspect-Oriented Programming, и в Java вам потребуется полагаться на какие-то особые маги c, такие как Spring, чтобы сделать это (или AspectJ et c.), но за кулисами мы будем использовать простые шаблоны проектирования, такие как Proxy, или что бы то ни было, есть много способов снять шкуру с кошки.

Аннотации - это просто метаданные в конце дня, и полагаться на что-то другое, читая и интерпретируя их соответствующим образом, если вы используете аннотацию Spring, ее, вероятно, необходимо использовать для метода / поля в компоненте Spring.

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