Scala Language
aantekeningen
Zoeken…
Syntaxis
- @AnAnnotation def someMethod = {...}
- @AnAnnotation class someClass {...}
- @AnnotatioWithArgs (annotation_args) def someMethod = {...}
parameters
Parameter | Details |
---|---|
@ | Geeft aan dat het volgende token een annotatie is. |
SomeAnnotation | De naam van de annotatie |
constructor_args | (optioneel) De argumenten die aan de annotatie zijn doorgegeven. Indien geen, zijn de haakjes niet nodig. |
Opmerkingen
Scala-lang biedt een lijst met standaardannotaties en hun Java-equivalenten .
Een annotatie gebruiken
Deze voorbeeldaantekening geeft aan dat de volgende methode is deprecated
.
@deprecated
def anUnusedLegacyMethod(someArg: Any) = {
...
}
Dit kan ook worden geschreven als:
@deprecated def anUnusedLegacyMethod(someArg: Any) = {
...
}
Annoteren van de hoofdconstructeur
/**
* @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)
}
De zichtbaarheidsmodificator (in dit geval protected
) moet na de annotaties op dezelfde regel komen. In het geval dat de annotatie optionele parameters accepteert (zoals in dit geval @throws
een optionele oorzaak accepteert), moet u een lege parameterlijst voor de annotatie opgeven: ()
vóór de constructorparameters.
Opmerking: er kunnen meerdere annotaties worden opgegeven, zelfs van hetzelfde type ( herhalende annotaties ).
Op dezelfde manier met een case-klasse zonder extra fabrieksmethode (en oorzaak opgegeven voor de annotatie):
case class Division @throws[ArithmeticException]("denom is 0") (num: Int, denom: Int) {
private[this] val wrongValue = num / denom
}
Uw eigen annotaties maken
U kunt uw eigen Scala-annotaties maken door klassen te maken die zijn afgeleid van scala.annotation.StaticAnnotation of 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{}
Annotaties kunnen vervolgens worden ondervraagd met behulp van de reflectie-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"))