• トップ
  • ブログ一覧
  • 最新のJava12でプレビュー実装されたSwitch式の使いみちと有効性を考察する
  • 最新のJava12でプレビュー実装されたSwitch式の使いみちと有効性を考察する

    広告メディア事業部広告メディア事業部
    2019.06.25

    IT技術

    Java12から「Switch式」がプレビュー実装

    Java12からSwitch式が実装されました。

    従来からあったswitch文が改良され「式」としても書けるようになりました。

    ただし、Java12でswitch式はプレビュー実装ですので、評価版の扱いです。

    Switch式については、『 JEP 325: Switch Expressions (Preview) 』に定義されています。

    JEP 325: Switch Expressions (Preview)

    Java12をインストールしただけでは使用できず、コンパイル時に --enable-preview  を指定してやる必要があります。

    プレビューではありますが、今がライバルに差をつけるチャンスかもしれません。

    Switch式の使いみちや有効性を考察し、正式実装時にスタートダッシュが切れるようにしておきましょう!

    プレビュー実装の目的とは?

    プレビュー実装については、JEP 12: Preview Language and VM Featuresで定義されています。

    JEP 12: Preview Language and VM Features

    Javaは、世界規模に展開されている言語のため、新たな設計を組み込むには大きなリスクが伴います。

    そこで、正式に組み込む前の仮実装とすることで、全世界の開発者に評価、フィードバックが得られる枠組みが設けられているわけです。

    現行のSwitch文は、Javaの中核とも言える言語機能です。

    そのSwitch文を拡張し、利便性を高めたSwitch式は、今後多くの開発者が利用することになるのは間違い有りません。

    なぜSwitch式 が、プレビューで実装されたかが納得できますね。

    プレビュー実装である以上、次期以降のJavaでは仕様が変更される可能性もあります。

    ただし、Java12で実装したSwitch式がJava13以降でコンパイルに失敗する可能性があることは覚えておきましょう。

    Switch文とSwitch式は何が違うのか?

    文と式の違い

    「Switch文」は処理のブロックです。

    条件分岐の if文 と同様に、値に応じた条件分岐を書くことができます。

    Java12の現在まで書いてきたSwitch文そのものです。

    一方で、Java12でプレビュー実装された「Switch式」は条件式です。

    左辺に変数を置き、Switchで条件に応じた値を代入することができます。

    switch (文)

    以下は、これまでのSwitch文を使ったサンプルです。

    拡張子が「txt」または「xml」の場合は、 fileType変数に”TEXT”を設定し、拡張子が「exe」の場合はfileType変数に”BINARY”、それ以外の場合はfileType変数に”OTHER”を設定し、返却するサンプルです。

    1String getType(String extension) {
    2  String fileType = null;
    3  switch (extension) {
    4      case.txt”:
    5      case.xml”:
    6          fileType =TEXT;
    7          break;
    8      case.exe”:
    9          fileType =BINARY;
    10          break;
    11      default:
    12          fileType =OTHER;
    13          break;
    14  }
    15  return fileType;
    16}

    Switch文の用例として、上記のように条件に応じて変数の設定値を変更するケースが多くあります。

    Java12でプレビュー実装されたSwitch式を使えば、より簡潔に実装することができます。

    switch (式)

    1String getType(String extension) {
    2  String fileType = switch (extension) {
    3    case ".txt", ".xml":
    4        break "TEXT";
    5    case ".exe":
    6        break "BINARY";
    7    default:
    8        break "OTHER";
    9  };
    10  return fileType;
    11}

    さらに、アロー構文 ”->” を使用すれば、より簡潔に実装することができます。

    1String getType(String extension) {
    2  String fileType = switch (extension) {
    3    case ".txt", ".xml" -> "TEXT";
    4    case ".exe" -> "BINARY";
    5    default -> "OTHER";
    6  };
    7  return fileType;
    8}

    以上より、Switch式を使うことで「ある変数に設定する値を条件によって切り替える」ことが明確に書けるようになりました。

    switch文でアロー構文を使う

    ここまででは、Switch式がSwitch文と比べてコード量が圧倒的に少なく、簡潔に書けるように見えます。

    ですが、Java12では、Switch式を簡潔にしているアロー構文をSwitch文でも書くことができます。

    「switch (文)」で例に挙げたコードをアロー構文を使って書き直すと、次のようなコードになります。

    switch文(アロー構文)

    1String getType(String extension) {
    2  String fileType = null;
    3  switch (extension) {
    4      case ".txt", ".xml"-> fileType = "TEXT";
    5      case ".exe" -> fileType = "BINARY";
    6      default -> fileType = "OTHER";
    7  }
    8  return fileType;
    9}

    各caseで fileType変数に代入する実装になっており、Swith式よりは見劣りしますが、コード量は同等です。

    アロー構文はJava12から使える構文ですので、Switch式と同様にJavaソースのコンパイル時に --enable-preview  を指定する必要があります。

    --enable-preview  を指定せずにコンパイルした場合は「Switchルールはプレビュー機能であり、デフォルトで無効になっています。」や、「複数のcaseラベルはプレビュー機能であり、デフォルトで無効になっています。」など、これら機能がデフォルトでは無効になっていることを示すエラーメッセージが表示されます。

    Switch式の使い道と有効性

    Switch式の使い道は、変数に値を代入したいもののパターンが多いといった場合に使うのが適切です。

    Switch式を使用する場合は、アロー構文の使用を徹底することで、コード量が減り、式への代入であることを明確にすることができます。

    アロー構文を使用すれば、breakを書く必要がなくなり、しばしば問題視される「ウォークスルー問題」も回避することができます。

    以上から、アロー構文を使用したSwitch文であれば、有効性はとても高いと言えます。

    まとめ

    効果的な使い方は、以下の通りと考えます。

    1. 条件によって変数に値を設定し分けたい場合はSwitch式を使う
    2. 条件によって処理を分岐したい場合にはSwitch文を使う

    Java12であれば、Switch文を使う場合もSwitch式を使う場合も、積極的にアロー構文を使用することで、従来のJavaよりもコード量が減り、ウォークスルーなどの問題も回避できるので積極的に活用することをおすすめします。

    ただし、Java12のSwitch式やアロー構文などの新機能は「プレビュー実装」ですので、まだ納品するシステムで使うことは避けましょう

    また、プレビュー実装ということは、今後のJavaリリースで仕様が変更される可能性があり、コンパイルすら通らなくなるかもしれないことは認識したうえで使う必要があります。

    こちらの記事もオススメ!

    featureImg2020.07.28Java 特集実装編※最新記事順に並べています。Amazon EMRのHadoop完全分散モードクラスタ上でApache Spark...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事