2008-12-08 5 views
11

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

Эта аннотация создаст для вас простой геттер и сеттер.

@attribute 
private String var = ""; 

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

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

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

+0

Хороший вопрос. Эти двое - это именно то, что у меня было в моем списке Java, довольно долгое время! Здесь есть надежда ... – 2010-06-24 11:23:44

ответ

15

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

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

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

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

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

+0

Вы можете создать суперкласс ... См. Http://code.google.com/p/javadude/wiki/Annotations – 2009-03-25 14:26:25

4

Есть ли способ использовать аннотации в Java для замены доступа?

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

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

Для более драматической Сравним, например, EJB 2 с EJB 3.

4

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

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

Был интересный аллюзия на реализацию свойств с аннотациями в Java Posse episode #219.

+0

Наверное, мне не поможет. Я просто оставил java 1.4, и это только для этого проекта. Ahh - кровоточащий край Oracle. – 2008-12-08 20:32:32

+0

Lucky. Мне все еще нужно использовать 1.2 ... – 2010-02-02 18:24:28

2

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

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

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

2

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

Отъезд 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 от текущей версии

13

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 или имя?) И т. Д. И есть еще. Например, мне очень нравятся методы расширения.

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

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

1

Хотя они иногда бывают полезны, если вы серьезно отсутствующих атрибутов, то вы, вероятно, немного шататься по всей конструкции OO вещи.

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

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

Возможно, сначала это будет сложно, но я уверен, что в конце вы будете более твердо разбираться в принципах проектирования OO.

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