環境
$ java -version openjdk version "14-ea" 2020-03-17 OpenJDK Runtime Environment (build 14-ea+34-1452) OpenJDK 64-Bit Server VM (build 14-ea+34-1452, mixed mode, sharing)
$ VER Microsoft Windows [Version 10.0.18362.592]
JDK14
JEP 305: Pattern Matching for instanceof (Preview)
JEP 305: Pattern Matching for instanceof (Preview)
概要(超要約)
instanceof
で型チェックする際に、型変換も同時にするようにしたよ。
なぜ入ったのか
今までの実装だと、下記のように String s = (String) obj;
するケースが多かったと思う。
if (obj instanceof String) { String s = (String) obj; // use s }
instanceof
を使う場合、高確率でこういう使い方をやり、コードが煩雑になっていくことがある。
ダウンキャストがある状態は、参照してはいけない変数やメソッドが参照できるようになるので、あまりよろしくない。
テストコード
public class JEP305 { public static void main(String[] args) { Object obj = "hello saga!"; if (obj instanceof String s) { System.out.println(s.length()); } else { System.out.println("not String"); } } }
とりあえず、安定のhello saga
で。
実行
$ javac --enable-preview -source 14 JEP305.java $ java --enable-preview JEP305 11
変換したString型として使用できているのが分かる。
感想
もっと早く導入されていても良さそうが気がした対応では?と心のなかで感じた。