JEP378を読んで、テキスト変換の方法をおさらいする

エキサイト株式会社エンジニアの佐々木です。Java17が昨年リリースされ、JEP378のテキストブロックがLTSとして入ったので改めてJEP378を読むとテキスト変換の方法がいくつか書いてあったので、復習がてらおさらいします。

openjdk.java.net

テキストブロックとは?

Javaには複数行のテキストをまとめて扱える仕様がありませんでした。複数行ある場合は、1行ずつ文字列を連結する必要がありました。

String s = "<h2>%s</h2>" +
                "<h3>%s</h3>" +
                "";

テキストブロックは、これをまとめて扱えるようにする仕様変更になります。""" 文字列 """ このような形で記述します。

String s = """
                <h2>%s</h2>
                <h3>%s</h3>
                """

ちょっとしたSQLやテンプレートなど複数行で書きたいことは多いと思います。ちょっと便利になりました。では、テキストブロック内に変数を入れたい場合はどうするのかを見ていきましょう。

前提

リクエストパラメータで設定したパラメータでH2H3をそれぞれ表示する簡単なWebアプリケーションを作ります。下記のようなリクエストとレスポンスになる想定です。

curl http://localhost:8080?h2=hogehoge&h3=fugafuga

<h2>hogehoge</h2>
<h3>fugafuga</h3>

String.format を使用する

JDK1.0からあるメソッドになります。String.format(String s , args...) の形になります。書いてみて結構読みづらいので、他の方法がある場合はそちらを見たほうがいいですね。

@RestController
public class DemoController {

    @GetMapping
    public String index(@RequestParam String h2, @RequestParam String h3) {

        return String.format("""
                <h2>%s</h2>
                <h3>%s</h3>
                """, h2, h3);
    }
}

String.formatted を使用する

テキストブロック内の文字列を変数で置換したいときには、formattedメソッドを使います。テキストブロック内の%sを置き換えてくれます。

@RestController
public class DemoController {

    @GetMapping
    public String index(@RequestParam String h2, @RequestParam String h3) {

        return """
                <h2>%s</h2>
                <h3>%s</h3>
                """
                .formatted(h2, h3);
    }
}

今回は引数が2つなのでこれでいいですが、引数が多くなってくると対応付けが煩雑になってきます。

String.replace を使用する

変換する変数が多くなってきた場合は、JEP378JEP 378: Text Blocksにも記載がありますが、String#replaceで代替するようです。

@RestController
public class DemoController {

    @GetMapping
    public String index(@RequestParam String h2, @RequestParam String h3){

        return """
                <h2>$h2</h2>
                <h3>$h3</h3>
                """
                .replace("$h2", h2)
                .replace("$h3", h3);
    }
}

Kotlinのようにはいかないですが、変数が多い場合の解決方法としてはいいかなと思います。

まとめ

JEP378を見てみると使い方に関することが結構書かれていて勉強になりました。Javaは半年に1度アップデートがかかりますので、今後もウォッチしていこうと思います。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com