Scala Language
annotazioni
Ricerca…
Sintassi
- @AnAnnotation def someMethod = {...}
- @AnAnnotazione class someClass {...}
- @AnnotatioWithArgs (annotation_args) def someMethod = {...}
Parametri
Parametro | Dettagli |
---|---|
@ | Indica che il token che segue è un'annotazione. |
SomeAnnotation | Il nome dell'annotazione |
constructor_args | (facoltativo) Gli argomenti passati all'annotazione. Se nessuno, le parentesi non sono necessarie. |
Osservazioni
Scala-lang fornisce un elenco di annotazioni standard e i relativi equivalenti Java .
Usando un'annotazione
Questa annotazione di esempio indica che il seguente metodo è deprecated
.
@deprecated
def anUnusedLegacyMethod(someArg: Any) = {
...
}
Questo può anche essere scritto in modo equivalente come:
@deprecated def anUnusedLegacyMethod(someArg: Any) = {
...
}
Annotazione del costruttore principale
/**
* @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)
}
Il modificatore di visibilità (in questo caso protected
) dovrebbe venire dopo le annotazioni nella stessa riga. Nel caso in cui l'annotazione accetti i parametri opzionali (come in questo caso @throws
accetta una causa opzionale), è necessario specificare un elenco di parametri vuoto per l'annotazione: ()
prima dei parametri del costruttore.
Nota: è possibile specificare più annotazioni, anche dello stesso tipo ( annotazioni ripetute ).
Allo stesso modo con una classe di caso senza metodo di produzione ausiliario (e la causa specificata per l'annotazione):
case class Division @throws[ArithmeticException]("denom is 0") (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
}
Creare le tue annotazioni
Puoi creare le tue annotazioni Scala creando classi derivate da scala.annotation.StaticAnnotation o 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{}
Le annotazioni possono quindi essere interrogate utilizzando l'API di riflessione.
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"))