Каковы Scala аннотации на самом деле?

Я не знаю Java, и я начал изучать Scala. Что такое аннотации и для чего они предназначены?

Ответ 1

Аннотации представляют собой метаданные, привязанные к классам/методам/полям и могут использоваться фреймворками для определения требуемой функциональности, окружающей эти классы/методы/поля.

Общее использование:

  • в качестве меток единицы измерения и для соответствующей настройки/срыва (например, JUnit и TestNG).
  • Маркировка классов и полей для сохранения (например, Hibernate)
  • маркировка классов и полей, которые будут отображаться как JMX beans

Аннотации - это Java-функция, и как таковая доступна в Scala, а также Java.

Ответ 2

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

@SuppressWarnings("deprecation")
void useADeprecatedMethod() {
    someObj.someDeprecatedMethod();
}

Здесь аннотация @SuppressWarnings сообщает компилятору не выдавать предупреждение о useADeprecatedMethod's использовании someDeprecatedMethod.

Другие применения в мире Java включают добавление информации в класс относительно того, как она сопоставляется с реляционной базой данных для использования с OR-образцами, такими как Hibernate.

В Scala ряд элементов, которые являются ключевыми словами или интерфейсами маркеров в Java, реализованы как аннотации в Scala. например @throws, @serializable.

Вот пример, показывающий Scala и Java, работающие вместе с помощью аннотации. Представьте, что мы собираемся определить класс Person в Scala. Когда мы приступим к использованию Person в Java, программист Java будет ожидать, что у нас будут методы setName и getName, как это соглашение bean в Java. Это может быть достигнуто с помощью аннотации @BeanProperty:

Класс Person в Scala:

class Person {
  @BeanProperty
  var name = "Joe Bloggs"
}

В Java:

public void printPerson(Person p) {
    // Scala added the getName method for us
    System.out.println(p.getName());
}

Ответ 3

Одним из интересных аспектов аннотаций Java является контроль над их сохранением. Когда определен тип аннотации (класс Java, реализующий интерфейс Annotation), одним из его свойств является его RetentionPolicy, один из:

  • SOURCE - Аннотации должны быть отброшены компилятором.
  • CLASS - Аннотации должны записываться в файл класса компилятором, но не должны сохраняться VM во время выполнения.
  • RUNTIME - Аннотации должны быть записаны в файле класса компилятором и сохранены VM во время выполнения, поэтому их можно читать с рефлексивностью.