14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-18

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

[速報]Java 13が登場。ZGCの改善やSwitch式の実現など新機能。 Oracle Code One 2019 - Publickey
JDK 13 Documentation - Home

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

JDK 13

ここでは、一先ずJava SE 13 (JSR 388)の言語仕様に絞って内容を抽出します。

主な変更点

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

Java SE 13 (JSR 388)

JEP 354: Switch Expressions (Preview)

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)にてPreview機能とされていましたが、再検討されて新たにPreview機能とされています。

再検討された内容であるJEP 354: Switch Expressions (Preview)を見てみますと下記のように記載されています。

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

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

以下、実装サンプル

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)

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)で囲うことで+演算子を記載しなくてよくなりました。

従来までの記法

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

JEP355による記法

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

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

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

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?