S-JIS[2011-02-22/2012-10-20] 変更履歴
Scalaのアノテーション(注釈)のメモ。
|
|
アノテーションはコンパイラーやツールに解釈させる為の印。
アノテーションを使うときはJavaと同様に「@」を付けて使用する。
アノテーションを作るときはJavaとは違ってAnnotationクラスを継承したクラスとして作成する。
アノテーションを指定するには、(クラス等と同様に)そのまま完全修飾名で使うか、インポートして使う。
@scala.annotation.tailrec def f(n:Int) = 〜 |
import scala.annotation.tailrec @tailrec def f(n:Int) = 〜 |
引数のあるアノテーションでは、丸括弧を付けて引数を書く。
引数が複数あるときは、値をカンマで区切って列挙するか、「引数名=値」で指定する。
(コンストラクターの引数指定と同様)
@deprecated("非推奨です")
class A
|
@deprecated(message="非推奨です") class A |
Scalaのアノテーションは、以下のような所に付けられる。
(参考→Javaのアノテーションが付けられる場所)
| 主な場所 | 例 | 備考 |
|---|---|---|
| class |
@a class クラス名 extends 親クラス @a with トレイト @a { } |
親クラス(トレイト)からextends・ミックスインする場合、 クラス名・トレイト名の後ろに付けられる。 classだけでなく、traitやobjectも同様。 |
class クラス名(@a 引数:型 @a) |
コンストラクターの引数では、 引数名の前と型名の後ろに付けられる。 |
|
class クラス名[@a T]
|
型パラメーターに対するアノテーション。 | |
| type |
@a type 別名 = クラス @a with トレイト @a |
|
| val |
@a val 変数名 = 値 @a protected val 変数名 = 値 val 変数名:型 @a = 値
|
変数の型に付ける場合は、型名を省略できない。 varも同様。 |
| def |
@a def メソッド名() = 本体
|
|
def メソッド名(@a 引数:型 @a) = 本体 |
メソッドの引数では、 引数名の前と型名の後ろに付けられる。 |
|
def メソッド名():戻り型 @a = 本体
|
メソッドの戻り値の型に付ける場合は、 型名を省略できない。 |
Javaでは同一の場所に同じアノテーションを複数指定する事は出来ないが、Scalaでは可能。
標準で用意されているアノテーション。
|
|
scalaパッケージ直下のアノテーションは自動的にインポートされているので、そのまま使用可能。
それ以外のアノテーションは完全修飾名で指定するかインポートする必要がある。
| アノテーション名 | 例 | 備考 | |
|---|---|---|---|
| scala | throws |
@throws(classOf[java.io.IOException]) def f() = 〜 |
Javaのthrowsに相当。 これを付けると、生成されるバイトコード(classファイル)にthrows宣言が追加される。 Javaから当該メソッドを呼び出したい場合に使用する。 |
| scala | serializable |
@serializable
@SerialVersionUID(123L)
class A {
@transient val v = 456
} |
JavaのSerializableインターフェースに相当。 シリアライズ可能である事を示す。 |
| scala | SerialVersionUID | JavaのserialVersionUIDフィールドに相当。 | |
| scala | transient | Javaのtransientに相当。 シリアライズしないフィールドである事を示す。 |
|
| scala | cloneable |
@cloneable
class A {
override def clone() = super.clone().asInstanceOf[A]
} |
JavaのCloneableインターフェースに相当。 クローンが作成可能である事を示す。 (@cloneableを付けていないと、super.clone()を呼び出した時にCloneNotSupportedExceptionが発生する) |
| scala | deprecated |
@deprecated("非推奨です")
def f() = "hello, world"
|
Javaの@Deprecatedアノテーション(あるいはJavadocの@deprecatedタグ)に相当。 非推奨なクラス・メソッド・フィールドである事を示す。 |
@deprecated("非推奨です", "2.0")
def f() = "hello, world"
|
Scala2.9では、第2引数(どのバージョンから非推奨になったか)を指定しないと警告が出る。[2012-10-20] | ||
| scala | native | Javaのnativeに相当。 | |
| scala | volatile | Javaのvolatileに相当。 | |
| scala | unchecked |
def f(x: Option[Int]) = (x: @unchecked) match {
case Some(y) => y
//case None =>
}
|
match式においてcaseが足りなくてMatchErrorが出る可能性がある場合にコンパイル警告が出るが、それを抑止する。 |
| scala.annotation | switch |
(c: @switch) match {
case ' ' | '\t' => "blank"
case _ => "other"
}
|
match式をJavaのswitch文に展開する。 Scala2.8以降。 |
| scala.annotation | tailrec [2011-02-24] |
@tailrec
def f(n: Int, s:Int): Int = {
if (n <= 0) s else f(n-1, s+n)
}
|
末尾再帰を最適化する。 |
| scala | inline noinline |
メソッドをインライン化するかどうかの制御らしいが…。 | |
| scala | specialized [2011-02-24] |
class A[@specialized(Int, Long) T] {
def f(n: T) = n
}
|
通常のクラスの他に、アノテーションで指定したプリミティブ型に特化したクラスを生成する。 Scala2.8以降。 |
| scala.reflect | BeanProperty |
class A( @BeanProperty var zzz:Int ) class B {
@BeanProperty var zzz = 123
}
|
JavaBeans形式のセッター・ゲッターメソッド(setZzz()・getZzz())が生成される。 @BooleanBeanPropertyだとゲッターがisZzz()になる。 |