Какие цели аннотации применимы к записям 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 оба ваших примера будут компилироваться нормально.
Я хотел запретить пользователям использовать эту [аннотацию] в записи
Извините, это невозможно.