4
1

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 1 year has passed since last update.

[Java]テキストブロックってかなり便利だね

Posted at

Java15から文字列記述方法としてテキストブロックという機能ができました。

テキストブロックは、複数行にわたる文字列リテラルを簡単に作成できる新機能です。

これは、より大きなコードブロックやフォーマットされたテキストを表現するために非常に役立ち、従来の文字列リテラルの代わりにテキストブロックを使用することで、ソースコードがより読みやすくなり、維持管理も容易になります。

使い方

テキストブロックは3つのダブルクオート(""")で囲むことで定義します。
その中に記述されたテキストはそのままの形で文字列として保持され、改行も含めて保存されます。

String textBlock = """
                   文字列情報
                   """;

Before

例えば、Json形式の文字列をJavaで記述する場合、従来は下記のように記述する必要がありました。

Main
  public static void main(String[] args) {
    var json = "{ \"id\": \"1\", \"name\": \"Mike\", \"gender\": \"male\" }";
    System.out.println(json);
  }

エスケープがたくさんあるので、可読性が著しく低下していますね。

実行結果
> Task :Main.main()
{ "id": "1", "name": "Mike", "gender": "male" }

After

テキストブロックにすると、かなり見やすくなりますね!

Main
  public static void main(String[] args) {
    var id = "1";
    var name = "Mike";
    var gender = "male";
    var json = """
        { "id": "%s", "name": "%s", "gender": "%s" }
        """.formatted(id, name, gender);
    System.out.println(json);
  }

テキストブロック内で動的な変数を使いたい場合ですが、JavaScriptのテンプレートリテラルのような、テキストブロック内に変数を直接埋め込む機能はまだないので、String.format()formatted()機能を使わないといけないですね。

実行結果
> Task :Main.main()
{ "id": "1", "name": "Mike", "gender": "male" }

実行結果に変わりなしですね。

JSON形式を例にしましたが、そのほかにも、SQLクエリやHTML、XMLをJavaで記述したいときもテキストブロックは有用です。

テキストブロックを使ってHTMLを記述する

Main
  public static void main(String[] args) {
    String html = """
              <html>
                  <body>
                      <h1>Welcome to my website</h1>
                      <p>This is a sample paragraph.</p>
                  </body>
              </html>
              """;
    System.out.println(html);
  }
実行結果
> Task :Main.main()
<html>
    <body>
        <h1>Welcome to my website</h1>
        <p>This is a sample paragraph.</p>
    </body>
</html>

テキストブロックを使ってXMLを記述する

Main
  public static void main(String[] args) {
    String xml = """
              <?xml version="1.0" encoding="utf-8"?>
              <note>
                  <to>大谷</to>
                  <from>トラウト</from>
                  <heading>エンゼルスに居ようよ</heading>
                  <body>Showyどこにも行かないでくれ</body>
              </note>
              """;
    System.out.println(xml);
  }
実行結果
> Task :Main.main()
<?xml version="1.0" encoding="utf-8"?>
<note>
    <to>大谷</to>
    <from>トラウト</from>
    <heading>エンゼルスに居ようよ</heading>
    <body>Showyどこにも行かないでくれ</body>
</note>

テキストブロックを使ってSQLを記述する

Main
  public static void main(String[] args) {
    String sql = """
        SELECT *
        FROM employees
        WHERE id = %s
        ORDER BY salary DESC
        """.formatted("shotani");
    System.out.println(sql);
  }
実行結果
> Task :Main.main()
SELECT *
FROM employees
WHERE id = shotani
ORDER BY salary DESC

テキストブロックを使ってJSONを記述する

例にも挙げた通り、もちろんJSONも記述できます。

Main
  public static void main(String[] args) {
    var json = """
               { "id": "%s", "name": "%s", "gender": "%s" }
               """.formatted("1", "Mike", "male");
    System.out.println(json);
  }
実行結果
> Task :Main.main()
{ "id": "1", "name": "Mike", "gender": "male" }

まとめ

テキストブロックは3つのダブルクオート(""")で囲むことで定義できます。

従来の1つのダブルクオートで囲む”文字列”のなかで、文字列としてを扱いたいときは、エスケープ(\)を記述しなければいけないなど、非常に面倒で、かつ可読性が低下していましたが、テキストブロックによってそれらは解決します。

テキストブロックの使い所としては、JavaでJSONやXML、SQL、HTMLなどを記述するときのとても有用ですね!

以上ですー

4
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?