Полезные Java-Аннотаций

Мне интересно узнать именно какие аннотации Java люди думают, что являются самое полезное во время разработки. Это не обязательно должно ограничиваться основным API Java, вы можете включать аннотации, которые вы нашли в сторонних библиотеках или аннотации, которые вы разработали самостоятельно (убедитесь, что вы включаете ссылку на источник).

Мне действительно интересно общие задачи развития а не зная, почему @ManyToOne(optional=false) в JPA это круто...

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

14 ответов


я раздал кучу upvotes для других пользователей, но просто чтобы дать мои два цента, единственные три аннотации, которые я использую с любой регулярностью в разработке, - это основные аннотации, используемые непосредственно компилятором:

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

@Deprecated - укажите, что вы маркируете как что-то, что не должно использоваться с этого момента. Компилятор будет генерировать предупреждения для использования любых элементов кода, помеченных как устаревшие. В общем, осуждение говорит: "Это было здесь в прошлом, но это может уходите в будущем варианте."Убедитесь, что вы также используете связанный флаг "@deprecated" Javadoc в сочетании с этим, чтобы рассказать людям, что они должны использовать вместо этого.

@SuppressWarnings - сообщить компилятору для подавления определенных предупреждений он вызывает. Это может быть полезно для таких вещей, как, когда вы намеренно хотите использовать устаревшие методы, вы можете блокировать предупреждение об устаревании. Я, как правило, использую его много, чтобы блокировать всех любимых Предупреждение" Serialization UID " для сериализуемых классов (независимо от того,должны сделать это-еще одна дискуссия на другое время). Просто удобно для тех случаев, когда вы знаете, что то, что вы делаете, генерирует предупреждение, но вы на 100% уверены, что это правильное поведение.

посмотреть Sun Аннотации Руководство и проверьте раздел "аннотации, используемые компилятором". Эти три вопроса обсуждаются довольно долго.


на параллелизм Java на практике аннотации

очень полезно для описания, как именно ваш код является или не является потокобезопасным...


Я считаю, что аннотации, связанные с параллелизмом, определенные Брайаном Гетцем в его книге "параллелизм Java на практике", очень полезны:

  • @GuardedBy
  • @Immutable
  • @NotThreadSafe
  • @ThreadSafe

Они особенно полезны, поскольку FindBugs имеет шаблоны, которые их используют.

банка и документация свободно доступны по адресу http://www.javaconcurrencyinpractice.com/


@Override имеет мой голос. Это позволяет мгновенно понять, что ваш метод и делает ваш код более читаемым.


@Test

(JUnit 4) это сделало написание и понимание тестовых файлов немного чище. Кроме того, возможность добавить expected атрибут сохранил несколько строк кода здесь и там.


@Deprecated

введено в Java 5.

  • это помогает разработчикам увидеть, что устарело в IDEs. (До этого большинство IDEs все еще могли тянуть @deprecated из комментариев javadoc для определенного метода, но эта аннотация была хорошим способом сделать ее метаинформацией о самом методе, а не комментарием в документации.)
  • он также используется компилятором для распечатки предупреждений при использовании устаревших методы.

лично я смотрел на проверка бобов JSR303 и аннотации, которые он предоставляет, я думаю, они станут более распространенными, пока есть только несколько реализаций JSR, но они предоставляют аннотации, такие как:

@NotNull private String name;
@NotNull @Size(min = 5, max = 30) private String address;

подробнее здесь: http://jcp.org/en/jsr/detail?id=303


Они должны быть полезны, вы можете определить их в своих проектах, чтобы лучше сообщать намерения:

  • @ThreadSafe
  • @Immutable
  • @объекта value этого
  • @BagOfFunctions (например, java.утиль.Сборники)
  • etc

JUnit 4 с предоставляет очень полезные Примечания. вот учебник иллюстрирование использования аннотаций для определения тестов.

например

@Test(expected= IndexOutOfBoundsException.class) public void empty() { 
    new ArrayList<Object>().get(0); 
}

Как указал Дэн ниже,TestNG изначально это.


вот некоторые аннотации, которые я использую в повседневной разработке

Весна:

  1. @Autowired - используется для автоматического провода бобы
  2. @Rollback - если установлено значение true, будет откат всех операций БД, выполненных внутри тестового набора

JUnit:

  1. @Test - скажите, что метод является тестовым случаем
  2. @Ignore - если вы хотите проигнорировать любой из теста дела
  3. @Before - код, который должен выполняться перед каждым тестом

JPA:

  1. @Entity - сказать, что POJO является сущностью JPA
  2. @Column - сопоставьте свойство с столбцом DB
  3. @Id - скажите, что свойство java является первичным ключом
  4. @EmbeddedId - используется для составных первичных ключей
  5. @Transient - это свойство не должно сохраняться
  6. @Version - используется для управления оптимистической блокировки
  7. @NamedQuery - используется для объявления родной SQLs
  8. @OneToMany - один-ко-многим отношения
  9. @ManyToOne - "многие к одному" отношения

Я включил только самые важные из них.Вы можете найти подробную информацию обо всех аннотациях JPA из следующего связи.

http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html

http://www.hiberbook.com/


@Given

позволяет одному тесту JUnit строить на возвращаемом значении другого теста. Требуется JExample.


мы начали использовать инструмент компиляции под названием Ломбок (http://projectlombok.org/). Вы аннотируете классы, члены и т. д. и методы автоматически генерируются во время компиляции. Это отличное повышение производительности и экономит сотни строк утомительного кодирования.

вы хотите toString() метод, который будет автоматически сгенерирован? Просто аннотируйте свой класс с помощью @ToString.

устали от того, чтобы определить геттеры и сеттеры для ваших членов? Аннотируйте свой класс с помощью @Getter и / или @Setter и они автоматически добавляются.

хотите иметь регистратор SLF4J для регистрации? @Slf4j создает частный статический конечный регистратор для вас.

@Data
public class MyBean {
    // Getters for x and y, setter for y and constructor with x as arg automatically created!
    // toString() and hashCode() methods are there too!
    private final int x;
    private int y;
}

.

@Slf4j
public class SomeClass {
    public void doSomething() {
        log.info("I've got log.");
    }
}

настройка очень проста: просто добавьте provided зависимость maven. Также есть крошечный плагин Eclipse / IntelliJ.

Проверьте полный список функций там: http://projectlombok.org/features/index.html


Я начал проект weekend для реализации программирования по контрактной структуре с использованием аннотаций метода и параметров, например

... myMethod (@NotNull строка a, @NotNullOrEmpty строка b){

     if ( !validate() ){
         raiseException ..
     }

}

Я застрял в точке автоматического получения значений param. Отражение Java не имеет его. никогда не понимал разглагольствования нескольких людей на Java, пока не наткнулся на это ограничение.


@FunctionalInterface

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