【Java進化史 第18回】Java8 〜「@」も読めなかった日〜
若手のコードを見たとき、
固まったことがある。
-> が読めない。
Streamも追えない。
そして、やたらと出てくる「@」。
なんじゃこれ?
■ @ は何者か
調べてみると、
これは「アノテーション」という仕組みだった。
コードに“意味”を追加するための印。
処理そのものを書くものではない。
@Override
public String toString() {
return name;
}
「ちゃんとオーバーライドしていますよ」
という宣言だ。
もしメソッド名を間違えれば、
「それ、オーバーライドになっていませんよ」と
コンパイル時に教えてくれる。
人間のミスを減らすための仕組みだ。
■ いつからあったのか
アノテーションは、Java5から存在している。
つまり、
私が気づかなかっただけだ。
だがJava8で、
その世界は少し広がった。
■ Javaで使える主なアノテーション一覧(〜Java8)
| アノテーション | 用途 | 利用可能バージョン |
|---|---|---|
| @Override | 正しくオーバーライドしていることを示す | Java5〜 (※Java6からインターフェースにも適用可) |
| @Deprecated | 非推奨であることを示す | Java5〜 |
| @SuppressWarnings | コンパイラ警告を抑制する | Java5〜 |
| @SafeVarargs | 可変長引数の安全性を保証する | Java7〜 |
| @FunctionalInterface | 関数型インターフェースであることを示す | Java8〜 |
| 型アノテーション (@Target(TYPE_USE)) |
型そのものにアノテーションを付けられる | Java8〜 |
こうして並べてみると、
Java8で増えたものがある。
@FunctionalInterface と、
型アノテーションだ。
■ 型にも付くようになった
Java8から、
アノテーションは「型」にも付けられるようになった。
List<@NotNull String> names;
これまでは
@NotNull List<String> names;
こうだった。
前者は「namesがnullではない」。
後者は「リストの中のStringがnullではない」。
守れる範囲が、少し細かくなった。
■ 読めなかった理由
若手は、これを普通に読む。
私は止まった。
-> と同じくらい、
@ も読めなかった。
だが分かってしまえば、
やっていることはシンプルだ。
コードに意味を足しているだけ。
Java8はラムダだけではない。
@ の世界も、静かに広がっていた。
■ 次回へ
Java8で追加された @FunctionalInterface。
これはラムダと深く関係している。
Javaはどこまで「関数型」に寄ったのか。
次回、そこを見ていく。
0 件のコメント:
コメントを投稿