JEP
JEP 375: Pattern Matching for instanceof (Second Preview)
内容
大元であるJEP305との違いがよく分からんかった。。。
第二プレビューみたいな感じに捉えたけど、あってるのかな?
英語は、Google翻訳に一任しているから、あってるか、若干不安がある。。。
追加調査
さすがに、これだけだと中身なさすぎるので、以前調べはしたけど、記載してなかった内容を書いておく
ブロック外でキャストした値を参照できるか?
とりあえず、テストコード
やってることは、オブジェクト型にStringを突っ込んで、それをinstanceofで判定&キャストしている。
public class JEP375 { public static void main(String[] args) { Object obj = "JEP375"; if (obj instanceof String s) { // (a) System.out.println(s); } else { // (b) System.out.println(s); } } }
たぶん、(b)でコンパイルエラーになると思う。
そう思った理由は、参照できちゃ不味い箇所だから。
そして、緊張のコンパイル!
$ javac --enable-preview -source 15 JEP375.java JEP375.java:11: エラー: シンボルを見つけられません System.out.println(s);
恥をさらさずに助かった。。。
やはり、参照範囲は、ifのブロック内のみで、elseは対象外だったね。
この参照範囲になっていることで、安全にアクセスできるというわけですね。
感想
はやく入れて欲しい。
実装しているときに、意外と出くわす問題なので、この記述ができるようになるのは、読む方も実装する方も楽だと思う。
特に、基盤とかFW作っている人は、キャストのために変数作ったりするケースは多いんじゃないかな?
変数追加するだけってのを、軽視している人が意外と多いんだよね。
作る側は、そうだろうけど、読む方は、意図を理解するのに苦戦する。
あったほうが可読性上がるケースもあるから、一概には言えないけど、できることなら、変数はなるべく作らないほうがいい。
リーダブルコードに、なんか書いてあった気がする。
読んでるときにものすごい納得したのだが、どう書いてあったのか思い出せない。。。
たまに、読み返してみようかな?