Есть ли способ использовать аннотации в Java для замены аксессуаров?
Я немного новичок в аннотациях Java 5, и мне любопытно, возможно ли одно из них:
Эта аннотация будет генерировать простой getter и setter для вас.
@attribute
private String var = "";
Аннотация @NotNull
указывает, что переменная connot имеет значение null, поэтому вам не нужно писать этот шаблонный код каждый раз.
/*
* @param s @NotNull
*/
public void setString(String s){
...
}
Будет ли это работать? Они кажутся первыми, о чем я мог бы написать аннотации, если бы мог. Поскольку я не вижу многого в этом, когда читаю документы, я предполагаю, что это не совсем то, о чем идет речь. Любое направление здесь будет оценено.
Ответы
Ответ 1
Обработка аннотаций происходит в абстрактном синтаксическом дереве. Это структура, создаваемая парсером, и компилятор манипулирует.
В текущей спецификации (ссылка на нее) указано, что обработчики аннотаций не могут изменять абстрактное синтаксическое дерево. Одним из следствий этого является то, что создание кода не подходит.
Если вы хотите эту функциональность, посмотрите XDoclet. Это должно дать вам предварительную обработку генерации кода, я думаю, что вы ищете.
Для вашего примера @NonNull
JSR-305 является set аннотаций для улучшения обнаружения дефектов программного обеспечения и включает в себя @NonNull
и @CheckForNull
и множество других.
Изменить: Проект Lombok решает точно проблему генерации и генерации сеттера.
Ответ 2
Получатели/Установщики: Да, это возможно. Проект Lombok (http://projectlombok.org/index.html) определяет аннотации для создания методов получения/установки и т.д.
Так например
@lombok.Data;
public class Person {
private final String name;
private int age;
}
Сгенерирует getName
(не установщик, поскольку он является окончательным) и getAge
/setAge
. Он также сгенерирует equals
, hashCode
, toString
и aconstructor, инициализирующие обязательные поля (name
в этом случае). Добавление @AllArgsConstructor
сгенерирует конструктор, инициализирующий оба поля. Использование @Value
вместо @Data
сделает объекты неизменяемыми.
Существуют другие аннотации и параметры, позволяющие вам контролировать права доступа (должен ли ваш геттер быть защищенным или общедоступным), имена (getName()
или name()
?) И т.д. И это еще не все. Например, мне очень нравятся аннотации для сборщиков и методов расширения.
Ломбок очень прост в использовании:
- Просто скачайте jar и используйте аннотации, автоматически сгенерированные getter/setters могут быть использованы в вашем коде без какого-либо разъяснения.
- Аннотации используются только во время компиляции, а не во время выполнения, поэтому вы не распространяете ломбок с вашими банками.
- Большинство IDE поддерживают это, так что вы видите getter/setter в дополнении кода, навигации и т.д. В Netbeans это работает " из коробки". В IntelliJ IDEA используйте плагин Lombok.
NotNull: это поддерживается findbugs и IDEA IDE, возможно, другими
Ответ 3
Есть ли способ использовать аннотации в Java для замены доступа?
Короче говоря, нет, компилятор Java 5/6 не поддерживает это, и третьим сторонам будет сложно добавить такую поддержку в агностическом компиляторе.
Чтобы лучше описать аннотации, я бы начал с JUnit. Если вы пишете код для версий 3 (предварительные аннотации) и 4 (на основе аннотаций), вы быстро получите представление о том, как инфраструктура заменила контракт на основе шаблонов именования с помощью метода, основанного на аннотациях.
Для более драматического примера сравните EJB 2 с EJB 3.
Ответ 4
Атрибут @, который вы называете слишком сложным, работает с аннотациями, поскольку они теперь находятся на Java (как указал Джеймс).
Что вы, вероятно, ищете, это " properties", которые еще не существуют на Java. Но сейчас очень горячая тема, и мы можем получить их на Java 7 или, возможно, на Java 8 (поскольку я все еще придерживаюсь 1.4.2, это не поможет мне, но это может вам помочь).
Была интересная дискуссия о реализации свойств с аннотациями в Java Posse episode # 219.
Ответ 5
Существует проект под названием OVal, и я думаю, что он делает то, что вы хотите.
http://oval.sourceforge.net/
Если я помню право на предварительную вещь, то AspectJ необходим, однако простую проверку работы без AspectJ. проверьте его.
Существует также Hibernate Validator, проверьте также: P
Ответ 6
Это возможно, просто не там, где вы их объявляете.
Отъезд http://code.google.com/p/javadude/wiki/Annotations.
У меня есть класс, аннотированный как
package sample;
import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;
@Bean(properties={
@Property(name="name"),
@Property(name="phone", bound=true),
@Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
})
public class Person extends PersonGen {}
И он генерирует для вас класс PersonGen, содержащий геттеры/сеттеры и т.д.
Процессор также делает немного больше. Обратите внимание, что я работаю над новой версией, которая имеет небольшую потерю API от текущей версии
Ответ 7
Хотя они иногда полезны, если вы серьезно пропускаете атрибуты, то вы, вероятно, немного неустойчивы в целом по дизайну OO.
Идея OO Design заключается в том, что методы - это "Действия", в которых вы просите объект что-то сделать для вас - а не просто устанавливать или получать значение - это не объект, это структура.
Если вы считаете, что отсутствие атрибутов является серьезной проблемой, я настоятельно рекомендую вам некоторое время программировать кодирование, не прибегая к настройкам и сопротивляющимся геттерам.
Сначала это может быть сложно, но я уверен, что в конце вы будете более твердо разбираться в принципах дизайна OO.
(Примечание. Редкие ситуации, когда вы должны выполнять операции типа setter после построения объекта - чаще всего, когда вы должны создавать два объекта, которые ссылаются друг на друга. В этом случае я рекомендую нечто вроде строителя шаблон, где ваши сеттеры должны быть вызваны один раз и защищены от вызова дважды)