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

Предположим, у вас есть список GPA, найдите среднее значение, которое вы можете использовать в следующих документах в Java 8

    List<Double> gpas = Arrays.asList(1.0,2.0,3.0,4.0);
    double average = gpas.stream()
        .collect(Collectors.averagingDouble(value -> value.doubleValue()));
    System.out.println(average);
11
задан Michael Myers 25 March 2009 в 14:31
поделиться

7 ответов

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

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

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

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

Править: Ломбок проекта решает точно проблему поколения метода set и метода считывания.

15
ответ дан 3 December 2019 в 01:24
поделиться

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

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

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

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

4
ответ дан 3 December 2019 в 01:24
поделиться

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

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

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

4
ответ дан 3 December 2019 в 01:24
поделиться

Возможно, просто не, где Вы объявляете их.

Выезд 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 для Вас, содержа методы считывания/методы set, и т.д.

Процессор также делает вполне немного больше. Обратите внимание, что я работаю над новой версией его, которая имеет немного поломки API от текущей версии

2
ответ дан 3 December 2019 в 01:24
поделиться

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

Если я remeber право для вещи усовершенствования AspectJ необходим, однако простая работа проверки без AspectJ.попробуйте.

Существует, также В спящем режиме Блок проверки допустимости, проверяют его также :P

2
ответ дан 3 December 2019 в 01:24
поделиться

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

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

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

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

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

1
ответ дан 3 December 2019 в 01:24
поделиться

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

Так, например,

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

сгенерирует getName (не установщик, поскольку он окончательный) и getAge / setAge . Он также сгенерирует равно , hashCode , toString и конструктор, инициализирующий обязательные поля (в данном случае name ). Добавление @AllArgsConstructor приведет к созданию конструктора, инициализирующего оба поля. Использование @Value вместо @Data сделает объекты неизменяемыми.

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

Lombok очень прост в использовании:

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

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

13
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: