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"))


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow