Есть ли способ использовать аннотации в Java для замены аксессоров? - PullRequest
11 голосов
/ 08 декабря 2008

Я немного новичок в аннотациях Java 5, и мне любопытно, возможно ли одно из них:

Эта аннотация создаст для вас простой метод получения и установки.

@attribute
private String var = "";

Аннотация @NotNull указывает, что переменная не может быть нулевой, поэтому вам не нужно каждый раз писать этот шаблонный код.

/*
 * @param s @NotNull
 */
public void setString(String s){
    ...
}

Будет ли это работать? Они кажутся первыми вещами, для которых я написал бы аннотации, если бы мог. Так как я не вижу много об этом, когда я читаю документы, я предполагаю, что это не совсем то, о чем идет речь. Любое направление здесь будет оценено.

Ответы [ 7 ]

15 голосов
/ 08 декабря 2008

Обработка аннотации происходит в дереве абстрактного синтаксиса. Это структура, которую создает анализатор, а компилятор манипулирует.

Текущая спецификация (ссылка на сайт) гласит, что процессоры аннотаций не могут изменять абстрактное синтаксическое дерево. Одним из последствий этого является то, что он не подходит для генерации кода.

Если вам нужны такие функции, взгляните на XDoclet . Это должно дать вам предварительную обработку генерации кода, я думаю, что вы ищете.

Для вашего @NonNull примера, JSR-305 - это набор аннотаций для улучшения обнаружения программных дефектов, включает в себя @NonNull и @CheckForNull и множество других ,

Редактировать : Проект Lombok точно решает проблему генерации геттеров и сеттеров.

13 голосов
/ 02 февраля 2010

Getters / Setters: Да, это возможно. Project Lombok (http://projectlombok.org/index.html) определяет аннотации для создания геттеров / установщиков и т. Д.

Так например

@lombok.Data;
public class Person {
   private final String name;
   private int age;
}

Сгенерирует получатель для имени (не установщик, поскольку он является окончательным) и получатель / установщик для возраста. Также будут сгенерированы equals, hashCode, toString и construtor, инициализирующий обязательные поля (имя). Добавление @AllArgsConstructor сгенерирует конструктор, инициализирующий оба поля.

Существуют другие аннотации и параметры, позволяющие вам контролировать права доступа (должен ли ваш получатель быть защищенным или общедоступным), имена (getName или name?) И т. Д. И это еще не все. Например, мне действительно нравятся методы расширения.

Lombok очень прост в использовании. Просто скачайте флягу и используйте аннотации, тогда геттер / сеттеры могут быть использованы в вашем коде без какого-либо разъяснения. Более того, IDE, такие как Netbeans, поддерживают это, так что вы видите getter / setter при завершении кода, навигации и т. Д. Аннотации используются только во время компиляции, а не во время выполнения, поэтому вы не распространяете lombok с файлами jar.

NotNull: это поддерживается findbugs и IdeaJ IDE, возможно, другими

4 голосов
/ 08 декабря 2008

Указанный вами @attribute тоже не может работать с аннотациями, поскольку они теперь есть в Java (как указал jamesh).

Что вы, вероятно, ищете, это " properties ", которые еще не существуют в Java. Но сейчас это очень актуальная тема, и мы можем получить их в Java 7 или, может быть, в Java 8 (поскольку я все еще застрял на 1.4.2, это мне не поможет, но может помочь).

Был интересный намек на обсуждение реализации свойств с аннотациями в эпизоде ​​Java Posse # 219 .

4 голосов
/ 08 декабря 2008

Есть ли способ использовать аннотации в Java заменит аксессоры?

Короче говоря, нет, компилятор Java 5/6 не поддерживает это, и третьим сторонам было бы трудно добавить такую ​​поддержку без учета компилятора.

Чтобы лучше справляться с аннотациями, я бы начал с JUnit . Если вы напишите код для версий 3 (предварительные аннотации) и 4 (на основе аннотаций), вы быстро получите представление о том, как среда заменила контракт, основанный на шаблонах именования, на контракт, основанный на аннотациях.

Для более наглядного примера сравните EJB 2 с EJB 3.

2 голосов
/ 25 марта 2009

Возможно, только не там, где вы их объявляете.

Выезд 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 по сравнению с текущей версией

2 голосов
/ 08 декабря 2008

Есть проект с именем OVal, и я думаю, что он делает то, что вы хотите. http://oval.sourceforge.net/

Если я правильно запомнил, требуется AspectJ, но простая проверка работает без AspectJ. проверить это.

Существует также Hibernate Validator, проверьте также: P

1 голос
/ 02 февраля 2010

Хотя они иногда полезны, если вы серьезно упускаете атрибуты, вы, вероятно, немного неуверенны во всем, что касается дизайна ОО.

Идея OO Design заключается в том, что методы - это «Действия», в которых вы просите объект сделать что-то для вас - не просто установку или получение значения - это не объект, а структура.

Если вы считаете, что отсутствие атрибутов является серьезной проблемой, я настоятельно рекомендую вам некоторое время попробовать написать код, не используя сеттеры и сопротивляясь геттерам.

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

(Примечание. В редких случаях вы должны выполнять операции типа «setter» после создания объекта - чаще всего, когда вам необходимо создать два объекта, которые ссылаются друг на друга. В этом случае я рекомендую что-то вроде компоновщика шаблон, где ваши сеттеры должны вызываться один раз и защищены от повторного вызова)

...