概要
JavaのLTSバージョンの「17」がリリースされていたので、Java 11から新しく使えるようになった機能をメインにまとめます!
こんな機能あるよ!の紹介にとどめ、詳細は追いません。
「触ってみよう」「調べてみよう」のきっかけになればと!
Switch Expressions
switch文を式の中で使用できるようになりました!
jshell> var a = 1
a ==> 1
jshell> var b = switch (a) {
...> case 1 -> "one";
...> case 2, 3 -> "two or three";
...> default -> "other";
...> }
b ==> "one"
jshell>
ポイント
-
->
と記載することでbreak
を書かなくてよくなる- break実装漏れによるバグが減る!
-
,
でつなげることで複数項目ぬも対応
String.transform
jshell> String suffixA(String target) {
...> return target + "A";
...> }
| created method suffixA(String)
jshell> String suffixB(String target) {
...> return target + "B";
...> }
| created method suffixB(String)
jshell> var target = "target";
target ==> "target"
jshell> // transformを使うと
jshell> target.transform(str -> suffixA(str)).transform(str -> suffixB(str));
$9 ==> "targetAB"
jshell> // transformを使わないと
jshell> suffixB(suffixA(target))
$10 ==> "targetAB"
jshell>
上記は「末尾にAを付与し」さらに「末尾にBを付与する」実装です。
transformを使用することで、処理の順序と記述の順序が揃えられています!
関数インタフェースに慣れていないとキツそう😇
Text Blocks
"""
で囲うことで複数行にわたって文字列を定義することができるようになりました✨
jshell> var sample = """
...> sample
...> text
...> brock"""
sample ==> "sample\ntext\nbrock"
jshell>
String.formatted
Stringにformattedメソッドが追加され、以下のように文字列の埋め込みができるようになりました!
jshell> "str: %s".formatted("sample")
$3 ==> "str: sample"
jshell>
Helpful NullPointerExceptions
-XX:+ShowCodeDetailsInExceptionMessages
オプションをつけることで、
NullPointerExceptionsのメッセージがこれまでよりも詳細に取得できるようです!
Pattern Matching for instanceof
instanceof
によるインスタンスのクラスの判定と、キャスト(例:var str = (String)obj
)が同時にできるようになりました!
jshell> var obj = (Object)"sample";
obj ==> "sample"
jshell> if (obj instanceof String str) { // var str = (String) obj
...> System.out.println("obj is string : " + str);
...> }
obj is string : sample
jshell>
Records
lombokでいう@Value
を付与したオブジェクトに近い印象です。
以下は、fieldに id
とname
を持つクラスをrecordを使って生成する例です
jshell> record Sample(int id, String name) {}
| created record Sample
インスタンス化と、fieldの参照はこんな感じ
jshell> var sample = new Sample(1, "rhirabay")
sample ==> Sample[id=1, name=rhirabay]
jshell> sample.id()
$6 ==> 1
jshell> sample.name()
$7 ==> "rhirabay"
jshell>
Sealed Classes
「継承はさせたいけど、継承させるクラスはしぼりたい」ができるようになります!
例えば、以下のように記述するとBase
クラスを拡張できるのはExtended1
とExtended2
クラスだけという制約をつけられます
public abstract sealed class Base permits Extended1, Extended2 {}
おまけ(Preview機能)
Pattern Matching for switch
switchでインスタンスによる分岐ができるようになります!
ifと同じくキャストまでいっぺんに書けます
jshell> switch (obj) {
...> case Integer i -> "%d is integer".formatted(i);
...> case String s -> "%s is string".formatted(s);
...> default -> "other";
...> }