4
3

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.

Java 11 to 17

Last updated at Posted at 2021-09-30

概要

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に idnameを持つクラスを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クラスを拡張できるのはExtended1Extended2クラスだけという制約をつけられます

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";
   ...> }
4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?