Spring Boot 3の注目機能を使えばより柔軟に、より可読性が高く
どのようなソフトウェアでも同様に、新しいバージョンには新しい機能が備わっている。「現状の機能さえあれば問題ない。でもサポートが切れるなら仕方がない」と消極的ではもったいない。最新機能を使いこなせば、これまでにない恩恵を享受できる。
SB C&Sの佐藤梨花氏は「Spring Boot 3.0以上にアップグレードすると、Javaの最新バージョン(17以降)など最新の便利な機能が増えます。すると開発がもっと便利に、楽しくなります!」と元気よく言う。佐藤氏は現在新興商材プリセールスエンジニアでDevOpsや生成AIなどを担当しているが、実は前職が基幹系Webアプリケーション開発を行うエンジニアで長らくJavaを使っていた。そのためJavaプログラミングに詳しい。
Spring Boot 3.0は2022年11月にリリースされた。2.0のリリースから5年ぶりのメジャーバージョンアップとなる。佐藤氏が推す追加機能にはJava 17ベースラインとJava 19のサポートのほかにも、サードパーティーのライブラリのアップデート、GraalVMネイティブイメージのサポート、Prometheusのサポートがある。
今回は厳選した重要なJava 17新機能を2つ紹介する。1点目は「Sealed Classes」、継承先を明示的に宣言・制御することが可能になるものだ。
従来、継承先を制限する方法にはprivateやprotectedがあった。しかし「データ構造的には分けたいが、privateなのでまとめてしまうか」「あまり継承してないけど制限したいからprotected」など、少し不便なところがあった。新しいSealedクラスなら「より柔軟かつ可読性の高い、データの目的に沿ったカプセル化が可能になります」と佐藤氏。
使い方としてはクラスまたはインスタンスに「sealed」修飾子を付与し、permitsにより継承を許可するクラスを定義する。複数あるならカンマ区切りで列挙する。なお許可されるサブクラスはsealedで宣言されたスーパークラスの同じモジュール内やそのパッケージなど「近く」に存在している必要がある。もしpermitsを省略するなら、スーパークラスを直接継承するクラスが自動で許可対象となる。
継承したサブクラスには、それ以降の継承制限を示す修飾子をつける。修飾子には「final(以降の継承を不許可)」「sealed(サブクラスを制限)」「non-sealed(サブクラスを制限しない)」の3種類がある。これを使うことでprivateやprotectedでは表現できなかった、柔軟かつ明示的な条件の指定が可能となる。佐藤氏は「親クラスを見れば継承されている子クラスが分かるので、可読性がかなり上ります」と言う。
2点目は「Pattern Matching for switch」。switch式でステートメントのパターンマッチングが利用可能となる。Java 17ではプレビューで、Java 21で正式採用となる。佐藤氏は「caseでパターンマッチングを可能とすることで、switch式とステートメントの表現力と適用範囲を拡張します」と説明する。
caseでnullやdefault、レコードクラスの指定許可、またswitch式でsealedクラスを指定可能、ガードパターン(caseにwhenで条件)を追加可能となった。switch対象の条件が緩和され、これまでif文で作成していたものもswitchで対応可能となった。
これまでのようにif文の条件分岐ではあらかじめ値を代入しておかないと、条件によってはnullが返ってしまいバグに繋がるリスクがある。またすべての分岐を通ると実行時間が長くなってしまうこともある(最も可能性が高い条件を一番上に書く必要がある)。
新しいswitch式であれば、null条件もcase文の中に入れることができ、double型も比較可能となり、default指定も可能となる。佐藤氏は「ぱっと見た時に何をしているか分かりやすく、もちろん最適化もできています。かなり可読性が高くなっているのではないでしょうか」と力を込める。