Scala Language
Annotations
Recherche…
Syntaxe
- @AnAnnotation def someMethod = {...}
- @AnAnnotation class someClass {...}
- @AnnotatioWithArgs (annotation_args) def someMethod = {...}
Paramètres
Paramètre | Détails |
---|---|
@ | Indique que le jeton suivant est une annotation. |
SomeAnnotation | Le nom de l'annotation |
constructor_args | (facultatif) Les arguments transmis à l'annotation. Si aucun, les parenthèses ne sont pas nécessaires. |
Remarques
Scala-lang fournit une liste d'annotations standard et leurs équivalents Java .
Utiliser une annotation
Cet exemple d'annotation indique que la méthode suivante est deprecated
.
@deprecated
def anUnusedLegacyMethod(someArg: Any) = {
...
}
Cela peut aussi être écrit de manière équivalente:
@deprecated def anUnusedLegacyMethod(someArg: Any) = {
...
}
Annoter le constructeur principal
/**
* @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)
}
Le modificateur de visibilité (dans ce cas protected
) devrait figurer après les annotations sur la même ligne. @throws
l'annotation accepte des paramètres facultatifs (comme dans ce cas, @throws
accepte une cause facultative), vous devez spécifier une liste de paramètres vide pour l'annotation: ()
avant les paramètres du constructeur.
Remarque: Plusieurs annotations peuvent être spécifiées, même du même type ( annotations répétées ).
De même avec une classe de cas sans méthode d'usine auxiliaire (et la cause spécifiée pour l'annotation):
case class Division @throws[ArithmeticException]("denom is 0") (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
}
Création de vos propres annotations
Vous pouvez créer vos propres annotations Scala en créant des classes dérivées de scala.annotation.StaticAnnotation ou 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{}
Les annotations peuvent ensuite être interrogées à l'aide de l'API de réflexion.
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"))