エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【Java】Java15先取り調査 JEP 375: Pattern Matching for instanceof (Second Preview)

JEP

JEP 375: Pattern Matching for instanceof (Second Preview)

内容

大元であるJEP305との違いがよく分からんかった。。。
第二プレビューみたいな感じに捉えたけど、あってるのかな?
英語は、Google翻訳に一任しているから、あってるか、若干不安がある。。。

suzaku-tec.hatenadiary.jp

追加調査

さすがに、これだけだと中身なさすぎるので、以前調べはしたけど、記載してなかった内容を書いておく

ブロック外でキャストした値を参照できるか?

とりあえず、テストコード
やってることは、オブジェクト型に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作っている人は、キャストのために変数作ったりするケースは多いんじゃないかな?

変数追加するだけってのを、軽視している人が意外と多いんだよね。
作る側は、そうだろうけど、読む方は、意図を理解するのに苦戦する。
あったほうが可読性上がるケースもあるから、一概には言えないけど、できることなら、変数はなるべく作らないほうがいい。

リーダブルコードに、なんか書いてあった気がする。
読んでるときにものすごい納得したのだが、どう書いてあったのか思い出せない。。。
たまに、読み返してみようかな?

suzaku-tec.hatenadiary.jp