3
2

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 3 years have passed since last update.

Java15の気になる新機能について触れてみた

Last updated at Posted at 2020-12-22

はじめに

こちらは ゆるWeb勉強会@札幌 Advent Calendar 2020 23日目の記事です。
Qiita には約1年ぶりの投稿となりました。

今回は、2020年9月15日にリリースされた Java15 の新機能について少し触れてみたいと思います。

Java15 の新機能

Java15 での主な変更点は下記URLにまとめられています。
https://openjdk.java.net/projects/jdk/15/

この記事では、以下の3点を取り上げます。

  • テキストブロック
  • レコード
  • パターンマッチング

テキストブロック

改行を含む文字列リテラルを定義できるテキストブロック。Java12よりプレビュー機能として実装されていましたが、今回正式版としてリリースされました。

テキストブロックは、ダブルクォーテーション3つ(""")で囲みます。

String htmlText = """
    <html>
        <body>
            <span>Text Blocks</span>
        </body>
    </html>
""";

HTMLやJSONのような(JSONはベタで書くことは少ないかな?)複数行の文字列を扱う機会は意外に多いので、ソースコードの可読性向上という面では、とても便利な機能だと思います。

テキストブロックの主な特徴:

  • 開始の区切り文字の直後は改行のみ(続けて文字を書くことはできない)
  • 各行の末尾の空白は除去される
  • インデントは、テキストブロック内の各行で最も浅いインデントで統一される

その他の仕様や機能追加の経緯については JEP のページを確認してみてください。
JEP 378: Text Blocks

レコード(セカンドプレビュー版)

レコード(record)を使うと、データを保持するためのイミュータブル(不変)なクラスを簡潔に定義できます。Java14 でプレビュー版として実装され、今回よりセカンドプレビュー版となりました。

レコードを定義する時は record クラス名(引数の指定) {} のように記述します。
具体的な例を見てみましょう。

Person というデータクラスに、フィールド name・age を定義するとします。

public record Person(String name, int age) {}

上記の記述だけで、コンパイル時にはコンストラクタや getter メソッドなどが自動的に生成されます。データクラスのコード記述量が圧倒的に少なくなりますね!!

public class Person extends Record {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getterのメソッド名は
    public String name() {
        return name;
    }
    public int age() {
        return age;
    }
    // ...以下省略...
}

コンストラクタで引数チェックを追加したい場合などは、必要に応じて処理を拡張することもできます。

Records はまだプレビュー版のため、Eclipse で動作させたい場合は、以下設定画面よりプレビュー機能を有効化してください。
image.png

参考:
JEP 395: Records

パターンマッチング(セカンドプレビュー版)

こちらは正規表現を指すものではなく、instanceof 演算子でオブジェクトの型チェックをした際、型のキャストが不要になるというものです。

従来の instanceof 演算子は、以下のように型チェックの後でキャストする必要がありました。

if (obj instanceof String) {
    String s = (String)obj;
    System.out.println(s.length());
}

パターンマッチングを使用する場合、型チェック後のキャストは不要で、指定した型の変数に格納するところまでを自動で行なってくれるようになります。

if (obj instanceof String s) {
    System.out.println(s.length());
}

参考:
JEP 375: Pattern Matching for instanceof (Second Preview)

余談: Javaのプレビュー版とは?

Javaのプレビュー版とは、新機能を正式に取り込む前に、試験的に実装される機能のことです。
基本的には以下のステップを踏んで正式リリースされます。

①プレビュー版として実装される
②セカンドプレビュー版として実装される
③正式版として実装される

プレビュー機能は開発者からのフィードバックを受け、最終的に正式リリースとなる場合もあれば、廃止となる場合もあります。

まとめ

先日リリースされたばかりの Java15 の新機能から、比較的内容が分かりやすく導入しやすそうな機能をピックアップしてご紹介しました。

現場では「他の言語と比べて Java は記述量が多くて面倒だ」といった声をよく耳にしますが(涙)、最近のリリース内容を見てみると、ソースコードの可読性や開発効率向上のための改善がどんどん採用されていることが分かります。

新しい書き方を積極的に取り入れて、もっと Java の良さを周りに伝えられるようになりたいです。

参考記事

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?