Java SE 13(JSR388)がリリースされたので試してみた

Oracleが「Oracle Code One 2019」にて発表したとおり、Java13がリリースされました。

[［速報］Java 13が登場。ZGCの改善やSwitch式の実現など新機能。 Oracle Code One 2019 － Publickey](https://www.publickey1.jp/blog/19/java_13zgcswitch_oracle_code_one_2019.html)
[JDK 13 Documentation - Home](https://docs.oracle.com/en/java/javase/13/index.html)

また、(あたりまえですが)OpneJDKにもJDKが配布されています。

[JDK 13](http://openjdk.java.net/projects/jdk/13/)

ここでは、一先ず[Java SE 13 (JSR 388)](http://cr.openjdk.java.net/~iris/se/13/latestSpec/)の言語仕様に絞って内容を抽出します。

## 主な変更点
今回のJDK13の変更点は少ないです。

[Java SE 13 (JSR 388)](http://cr.openjdk.java.net/~iris/se/13/latestSpec/)

### [JEP 354: Switch Expressions (Preview)](http://openjdk.java.net/jeps/354)

>Extend switch so it can be used as either a statement or an expression, and so that both forms can use either traditional case ... : labels (with fall through) or new case ... -> labels (with no fall through), with a further new statement for yielding a value from a switch expression. These changes will simplify everyday coding, and prepare the way for the use of pattern matching (JEP 305) in switch. This is a preview language feature in JDK 13.

簡単にすると、switchが文が拡張されて式およびステートメントとして使用できます。
Java12でも[JEP 325: Switch Expressions (Preview)](https://openjdk.java.net/jeps/325)にてPreview機能とされていましたが、再検討されて新たにPreview機能とされています。

再検討された内容である[JEP 354: Switch Expressions (Preview)](http://openjdk.java.net/jeps/354)を見てみますと下記のように記載されています。

>To yield a value from a switch expression, the break with value statement is dropped in favor of a yield statement.

これは、switch文の分岐による値の返却を行う際に、{}ブロックで記述をする際の返却値を新たなyieldステートメントとして宣言して値を生成するものです。

以下、実装サンプル

```java
import java.time.LocalDate;
import java.time.DayOfWeek;

public class Tester_01 {
    public static void main(String... args) {
        LocalDate today = LocalDate.now();
        System.out.println(java13(today.getDayOfWeek()));
    }
        private static int java13(DayOfWeek today) {
        int numLetters =  switch (today) {
            case MONDAY, FRIDAY, SUNDAY -> 6;
            case TUESDAY                -> 7;
            default                     -> {
                int k = today.toString().length();
                yield k;
            }
        };
        return numLetters;
    }
}

```


なお、Preview版なので、以下のように実行時は--enable-previewオプションが必要です。

```
workspace> javac --enable-preview --release 13 .\Tester_01.java
注意:.\Tester_01.javaはプレビュー言語機能を使用します。
注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。
PS C:workspace> java --enable-preview  Tester_01
```

### [JEP 355: Text Blocks (Preview)](http://openjdk.java.net/jeps/355)

>Add text blocks to the Java language. A text block is a multi-line string literal that avoids the need for most escape sequences, automatically formats the string in a predictable way, and gives the developer control over format when desired. This is a preview language feature in JDK 13.

これまでは、複数行の文字列を記載する際には、`"`で囲っていた文字列("one-dimensional" string literals)を+演算子を用いて記載していたものを、`"""`("two-dimensional" block of text)で囲うことで+演算子を記載しなくてよくなりました。


従来までの記法

```java
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("function hello() {\n" +
                         "    print('\"Hello, world\"');\n" +
                         "}\n" +
                         "\n" +
                         "hello();\n");
```

JEP355による記法

```java
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("""
                         function hello() {
                             print('"Hello, world"');
                         }
                         
                         hello();
                         """);
```

アノテーションを使用してSQLを実装する場合などに有用そうです。
※Kotlinではすでに対応しているものなので、この対応でKotlinの利便性にひとつ追いつく、といえるかも言えないです。

APIについては別途調査をしていきます。
不明点やおかしい記載内容がありましたら、お手数ですが編集リクエストをお願いいたします。