書こうと思ったきっかけ
そろそろリリースが近づいて来たので、まとめようと思い一念発起した。
サイト見る限り、最終リリース候補が出てるようなので、もう、大きな変更はないだろうから、キャッチアップしても大丈夫だろうという考えもある。
各種サイトへのリンク
https://openjdk.java.net/projects/jdk/13/
JEP
- 350: Dynamic CDS Archives
- 351: ZGC: Uncommit Unused Memory
- 353: Reimplement the Legacy Socket API
- 354: Switch Expressions (Preview)
- 355: Text Blocks (Preview)
ざっくり読んだ感じ、開発者に影響がありそうなのは、JEP 354/JEP 355
JEP 353も影響ありそうかと思ったけど、内部の実装の変更のようなので、調査対象から外した。
Google翻訳でやってるから、微妙に違うところがあるかも。。。
あと、見てて思ったが、JavaでSocketAPIを直に見るのは、学生のとき以来だなって思った。
354: Switch Expressions (Preview)
簡単に言うと、switchの結果を変数に入れられるようになった。
テストコード
下記の通り、テストコードを作成
java12のやつを流用して作った。
import java.util.Calendar; import static java.util.Calendar.*; public class jep354sample { public static void main(String[] args) { int day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; default -> 0; }; System.out.println("numLetters:" + numLetters); } }
実行
最初、default
がない状態でコンパイルしようとしたら、下記の通り、コンパイルエラーになった。
$ javac --enable-preview --release 13 jep354sample.java jep354sample.java:7: エラー: switch式がすべての可能な入力値をカバーしていません int numLetters = switch (day) { ^ 注意:jep354sample.javaはプレビュー言語機能を使用します。 注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。 エラー1個
網羅されてないとエラーになるようになったんだな。。。
それとも、前から?
Java12のときは、エラーにならなかった気がするが、気のせいかな?
本題とはそれるので、とりあえず、コンパイル&実行
$ javac --enable-preview --release 13 jep354sample.java $ java --enable-preview jep354sample numLetters:8
土曜日なので、SATURDAYだから、8
で正解。
どうでもいい話だが、SATURDAYは、一週間が終わったから「去ったデー」って習った。
注目スべきは、switchの戻り値があるところだろう。
これで、ケースに応じて結果を返せるようになった。
個人的には、defualtの挙動の方が驚いた。。。
swiftの画面遷移とかで使うswitchの使い方に近いことができるのではないかと思う。
yield
yieldっていう結果返すワードが追加されたので、試す。
テストコード
public class Jep354YieldSample { public static void main(String[] args) { String day = "xxx"; int j = switch (day) { case "MONDAY" -> 0; case "TUESDAY" -> 1; default -> { int k = day.toString().length(); System.out.println("default day:" + day); int result = f(k); yield result; } }; System.out.println("j:" + j); } private static int f(int k) { return k + 10000; } }
実行
実行したら、下記の通り。
$ javac --enable-preview --release 13 Jep354YieldSample.java $ java --enable-preview Jep354YieldSample default day:xxx j:10003
caseの中で計算が必要なときに使うのだろうけど、必要なのか疑問に感じてしまう。。。
とりあえず、新しい動きなので、覚えておいて損はないだろう。
355: Text Blocks (Preview)
開発者が定義した通りの文字列を定義できる。
エスケープ処理が入るので、開発者は、\n
とかを気にしなくていい
テストコード
import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Jep355Sample { public static void main(String[] args) throws Exception { String html = """ <html> <body> <p>Hello, Saga!!</p> </body> </html> """; System.out.println("== html =="); System.out.println(html); System.out.println("=========="); String query = """ SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; """; System.out.println("== sql =="); System.out.println(query); System.out.println("========="); ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(""" function hello() { print('"Hello, Saga!!"'); } hello(); """); } }
やってるのは、HTMLとSQLの表示、JSの実行。
実行
$ javac --enable-preview --release 13 Jep355Sample.java $ java --enable-preview Jep355Sample == html == <html> <body> <p>Hello, Saga!!</p> </body> </html> ========== == sql == SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; ========= Warning: Nashorn engine is planned to be removed from a future JDK release "Hello, Saga!!"
エスケープ文字列入れてないのに、ちゃんと改行されて、きれいにHTMLとSQLが出力される。
jsも、エスケープ処理なくても、きちんと実行できて"Hello, Saga!!"
が出力される。
簡単なDBアクセスでSQL発行するサンプルを作りたいとか、簡単にできそう。
できれば、文字列の代入もあるといいかなと思う。
いちいちプラスで連結するのは、面倒。
Swiftみたいに、\()
で代入できると楽なんだが、対応予定はあるのかな?
感想
355: Text Blocks がとても気になる。
文字列操作がもどかしいことがよくあるので、これからも継続的に改善があると嬉しい。
スケジュール通りに進んでいるようなので、Java13も予定通りリリースされると思う。