Какие цели аннотации применимы к записям Java?

У меня есть аннотация, используемая для методов или полей, определенных следующим образом:

      @Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
public @interface NotColumn {
}

Я хотел запретить пользователям использовать это в записи, поскольку было бы бессмысленно использовать эту аннотацию в этом контексте. Кажется, это не должно компилироваться, поскольку я не указываю ElementType.PARAMETER как действительный @Target.

Однако следующие компилируются нормально:

      public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
}

Но эта форма с компактным конструктором не может быть скомпилирована с « типом аннотации java: неприменимым к этому типу объявления » - чего я и ожидал.

      public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
   public MyRecord {
   }
}

1 ответ

Решение
      public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description

может немного походить на параметр, но с точки зрения таргетинга на аннотации это не совсем так. Он тоже может действовать как поле.

Из JLS (в этой версии выделены части, которые были изменены относительно записей):

Аннотации к компоненту записи класса записи могут распространяться на члены и конструкторы класса записи, как указано в 8.10.3.

Суть раздела 8.10.3 заключается в том, что аннотации, такие как ваши распространяются на созданные методы, поля и параметры, только если они применимы к этим целям . В противном случае они игнорируются. Ваша аннотация применима к полям, поэтому она будет распространена на сгенерированный поле записи.

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

Я хотел запретить пользователям использовать эту [аннотацию] в записи

Извините, это невозможно.

Другие вопросы по тегам