Scala Language
Adnotacje
Szukaj…
Składnia
- @AnAnnotation def someMethod = {...}
- @AnAnnotation class someClass {...}
- @AnnotatioWithArgs (annotation_args) def someMethod = {...}
Parametry
Parametr | Detale |
---|---|
@ | Wskazuje, że następujący token jest adnotacją. |
SomeAnnotation | Nazwa adnotacji |
Konstruktor_args | (opcjonalnie) Argumenty przekazane do adnotacji. Jeśli nie, nawiasy są niepotrzebne. |
Uwagi
Scala-lang udostępnia listę standardowych adnotacji i ich odpowiedników w języku Java .
Korzystanie z adnotacji
Ta przykładowa adnotacja wskazuje, że poniższa metoda jest deprecated
.
@deprecated
def anUnusedLegacyMethod(someArg: Any) = {
...
}
Można to również zapisać w sposób równoważny jako:
@deprecated def anUnusedLegacyMethod(someArg: Any) = {
...
}
Adnotacje do głównego konstruktora
/**
* @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)
}
Modyfikator widoczności (w tym przypadku protected
) powinien znajdować się po adnotacjach w tej samej linii. W przypadku, gdy adnotacja akceptuje parametry opcjonalne (tak jak w tym przypadku @throws
akceptuje opcjonalną przyczynę), musisz określić pustą listę parametrów adnotacji: ()
przed parametrami konstruktora.
Uwaga: można określić wiele adnotacji, nawet tego samego typu ( adnotacje powtarzające się ).
Podobnie z klasą spraw bez pomocniczej metody fabrycznej (i przyczyny określonej dla adnotacji):
case class Division @throws[ArithmeticException]("denom is 0") (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
}
Tworzenie własnych adnotacji
Możesz tworzyć własne adnotacje Scali, tworząc klasy pochodzące z scala.annotation.StaticAnnotation lub 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{}
Adnotacje można następnie przesłuchiwać za pomocą interfejsu API odbicia.
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"))