Существуют ли аннулируемые аннотации, которые неявно распространяются на универсальные типы? - PullRequest
3 голосов
/ 04 апреля 2019

Я работаю в проекте Java и недавно начал добавлять аннулируемые аннотации к аргументам метода и возвращаемым значениям. Мне было интересно, есть ли какие-либо аннотации, которые можно добавить к аргументу, чтобы он также охватывал универсальные типы. Прямо сейчас у меня есть случаи, подобные:

Map<String, String> someMethod(Map<String, Map<String, String>> arg) {
...
}

Это стало:

@NotNull
Map<@NotNull String, @NotNull String> someMethod(@NotNull Map<@NotNull String, @NotNull Map<@NotNull String, @NotNullString>> arg) {
...
}

Который становится, очевидно, трудным для чтения. Я не очень хорошо знаком с внутренними аннотациями Java, так что, возможно, это невозможно?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Сокращение количества нулевых аннотаций может быть достигнуто с помощью подходящей аннотации по умолчанию.

Следующее относится к аннотациям от org.eclipse.jdt.annotation_2.x:

В частности @org.eclipse.jdt.annotation.NonNullByDefault может влиять на типы в различных позициях, включая аргументы типов.

Так что если вы напишите:

@NonNullByDefault
Map<String, String> someMethod(Map<String,Map<String,String>> arg) { ...

, это действительно будет интерпретировано как

@NonNull Map<@NonNull String, @NonNull String> someMethod(@NonNull Map<@NonNull String, @NonNull Map<@NonNull String, @NonNull String>> arg) {

Возможно даже точная настройка эффекта @NonNullByDefault, и его можно применять к отдельным методам или целым классам, пакетам или модулям.

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

Общая документация о том, как Eclipse интерпретирует нулевые аннотации с учетом обобщений, может быть найдена вонлайн справка .

0 голосов
/ 04 апреля 2019

Я не знаю всех возможных аннотаций NotNull.Если кто-либо из них разрешает ElementType.TYPE_PARAMETER, тогда он должен иметь возможность комментировать дженерики.

Если нет, просто добавьте следующую аннотацию:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE_PARAMETER)
public @interface NotNull {}

и добавьте больше типов элементов, если хотитеиспользовать эту аннотацию в других отношениях, чем только дженерики.Если вы хотите использовать аннотацию во время выполнения через отражение, вам нужно изменить RetentionPolicy на RUNTIME.

...