Scala Language
Аннотации
Поиск…
Синтаксис
- @AnAnnotation def someMethod = {...}
- Класс @AnAnnotation someClass {...}
- @AnnotatioWithArgs (annotation_args) def someMethod = {...}
параметры
параметр | подробности |
---|---|
@ | Указывает, что следующий токен представляет собой аннотацию. |
SomeAnnotation | Название аннотации |
constructor_args | (необязательно) Аргументы, переданные аннотации. Если нет, скобки не требуются. |
замечания
Scala-lang предоставляет список стандартных аннотаций и их эквивалентов Java .
Использование аннотации
Эта аннотация показывает, что следующий метод deprecated
.
@deprecated
def anUnusedLegacyMethod(someArg: Any) = {
...
}
Это также можно записать эквивалентно:
@deprecated def anUnusedLegacyMethod(someArg: Any) = {
...
}
Аннотирование основного конструктора
/**
* @param num Numerator
* @param denom Denominator
* @throws ArithmeticException in case `denom` is `0`
*/
class Division @throws[ArithmeticException](/*no annotation parameters*/) protected (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
/** Integer number
* @param num Value */
protected[Division] def this(num: Int) {
this(num, 1)
}
}
object Division {
def apply(num: Int) = new Division(num)
def apply(num: Int, denom: Int) = new Division(num, denom)
}
Модификатор видимости (в этом случае protected
) должен появиться после аннотаций в той же строке. Если аннотация принимает необязательные параметры (так как в этом случае @throws
принимает необязательную причину), вы должны указать пустой список параметров для аннотации: ()
перед параметрами конструктора.
Примечание. Можно указать несколько аннотаций, даже с одного и того же типа ( повторяющиеся аннотации ).
Аналогично классу case без вспомогательного заводского метода (и причина, указанная для аннотации):
case class Division @throws[ArithmeticException]("denom is 0") (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
}
Создание собственных аннотаций
Вы можете создать свои собственные аннотации Scala, создав классы, полученные из scala.annotation.StaticAnnotation или scala.annotation.ClassfileAnnotation
package animals
// Create Annotation `Mammal`
class Mammal(indigenous:String) extends scala.annotation.StaticAnnotation
// Annotate class Platypus as a `Mammal`
@Mammal(indigenous = "North America")
class Platypus{}
Затем аннотации могут быть опрошены с использованием API отражения.
scala>import scala.reflect.runtime.{universe ⇒ u}
scala>val platypusType = u.typeOf[Platypus]
platypusType: reflect.runtime.universe.Type = animals.reflection.Platypus
scala>val platypusSymbol = platypusType.typeSymbol.asClass
platypusSymbol: reflect.runtime.universe.ClassSymbol = class Platypus
scala>platypusSymbol.annotations
List[reflect.runtime.universe.Annotation] = List(animals.reflection.Mammal("North America"))