はじめに
別記事で書いたようにアノテーション全盛期(?)にJavaをあまり触っていなかったので、アノテーションの引数ルールがよくわからず、ググっても需要を満たすものがなかったので自分で書きます。今後同じ疑問を持った方のために。
以下、例を示すアノテーションは@RequestMappingを使います。
用語定義
正確じゃないかもしれないけど以下ではこういう意味で使ってます。
- 引数
- アノテーション書くときに自分で指定する値および値を対応付ける名前。
- 要素
- リファレンスに書いてある、アノテーションが受け付ける名前。
ルール1:デフォルト値があるものは省略できる
@RequestMapping
のリファレンスを見るといくつか要素が書かれているが全部デフォルト値が指定されているので以下のように書いてもよい。各要素デフォルト値が使われる。
@RequestMapping
ルール2:引数名がvalueの場合は省略できる
以下は同じ意味
@RequestMapping(value = "/")
@RequestMapping("/")
Springの場合、@AliasFor
というものが用意されていて「Mappingのvalueってどういう意味?」となるところをpathと書けるようにもなっている。どの要素がvalueの別名かはリファレンスを見よう。大体感覚通りなものが別名になっていると思う。
@RequestMapping(path = "/")
ルール3:要素の型が配列の場合でもスカラー値で引数を書いてもよい
コンパイラが配列に拡張してくれる。
// value -> {"/"}
@RequestMapping("/")
自分で{}書いても書かなくてもいい。ただし次の説明する引数二つ以上書く場合は{}要る。
// value -> {"/", "/index"}
@RequestMapping("/", "/index")
// value -> {"/", "/index"}
@RequestMapping({"/", "/index"})
ルール4:引数が二つ以上の場合は引数名必須
Pythonのデフォルト値引数みたいに必須引数とオプション引数みたいになってるものだと思ったのでこれがわかりにくかった。
@RequestMapping(value = "/", method = RequestMethod.GET)
// Pythonのデコレーションみたく以下のようには書けない
@RequestMapping("/", method = RequestMethod.GET)