Java – 文本块和最佳实践

在 Java 中,文本块多行字符串文本。这意味着我们不需要陷入显式行终止符,字符串串联和分隔符的混乱,否则用于编写正常的字符串文本。

Java 文本块在 Java 13 (JEP 355) 和 Java 14 (JEP 368) 中作为预览功能提供。它计划成为 Java 15 (JEP 378) 中的标准功能。

若要启用此预览功能,我们必须使用 –启用预览和 –source 14(两个连字符)标志。

1. 文本块语法

  • 文本块包含多行文本,并使用三个双引号字符 (“”“) 作为其开始和结束分隔符
  • 开头的三个双引号字符始终后跟一行终止符。
  • 我们不能在一行上放置分隔符和文本块。开头分隔符必须位于其自己的行上。内容必须仅从下一行开始。
  • 如果文本内容包含单引号或双引号,则无需对其进行转义。
String dbSchema =   """
      CREATE TABLE 'TEST'.'EMPLOYEE'
      (
        'ID' INT NOT NULL DEFAULT 0 ,
        'FIRST_NAME' VARCHAR(100) NOT NULL ,
        'LAST_NAME' VARCHAR(100) NULL ,
        'STAT_CD' TINYINT NOT NULL DEFAULT 0
      );
          """;

虽然上面的文本块看起来非常简单,但仍然有很多事情发生在引擎盖下。让我们来探索一下。

2. 文本块类似于字符串

  • 从文本块生成的实例的类型与传统的双引号字符串具有相同的特征。这包括对象表示和暂入字符串池java.lang.String
  • 我们可以使用文本块作为方法参数传递类型 。String
  • 文本块可以在可以使用字符串文本的任何位置使用。例如,我们可以将其用于字符串串联。
String string = "Hello";
String textBlock = """
          World""";
 
String joinedString =  string + textBlock;
 
System.out.println(joinedString);

程序输出。

Hello
World

3. 缩进

3.1. 附带和必要的缩进

文本块保留其内容的缩进。为此,JEP 将空间划分为偶然的和必要的压痕

为了在上下文中讨论,让我们参考第一个例子。

String dbSchema =   """
      CREATE TABLE 'TEST'.'EMPLOYEE'
      (
        'ID' INT NOT NULL DEFAULT 0 ,
        'FIRST_NAME' VARCHAR(100) NOT NULL ,
        'LAST_NAME' VARCHAR(100) NULL ,
        'STAT_CD' TINYINT NOT NULL DEFAULT 0
      );
          """;
 
System.out.println(dbSchema);

程序输出:

|CREATE TABLE 'TEST'.'EMPLOYEE'
|(
'ID' INT NOT NULL DEFAULT 0 ,
'FIRST_NAME' VARCHAR(100) NOT NULL ,
'LAST_NAME' VARCHAR(100) NULL ,
'STAT_CD' TINYINT NOT NULL DEFAULT 0
|);

在这里,我们有两种类型的缩进:

第一个缩进是从行的开头到所有行中的单词。这可以根据各种因素增加或减少,例如格式化插件或开发人员的选择。这是偶然的缩进"CREATE"

第二个缩进是从字符开始到 。大多数时候是4或8个空间长。为了保持文本块缩进的意图,应该尊重这一点。这称为基本缩进'(''ID'

Java 文本块会删除所有附带的缩进,只保留必要的缩进。

3.2. 添加一些所需的缩进

让我们想象一下,我们要为上面示例中的所有行提供2个选项卡缩进到左边。我们可以通过仔细定位结束的三重报价来做到这一点,以将2个选项卡移动到左侧。放置位置与基本缩进应拾取的位置完全相同。

String dbSchema =   """
      CREATE TABLE 'TEST'.'EMPLOYEE'
      (
          'ID' INT NOT NULL DEFAULT 0 ,
          'FIRST_NAME' VARCHAR(100) NOT NULL ,
          'LAST_NAME' VARCHAR(100) NULL ,
          'STAT_CD' TINYINT NOT NULL DEFAULT 0
      );
  """;
 
System.out.println(dbSchema);        

程序输出:

|   CREATE TABLE 'TEST'.'EMPLOYEE'
|   (
|       'ID' INT NOT NULL DEFAULT 0 ,
|       'FIRST_NAME' VARCHAR(100) NOT NULL ,
|       'LAST_NAME' VARCHAR(100) NULL ,
|       'STAT_CD' TINYINT NOT NULL DEFAULT 0
|   );

另外,请注意,Java 编译器也会去除文本块中每一行上的尾随空格

3.3. 处理选项卡

遗憾的是,编译器不难知道 TAB 字符在不同编辑器中的显示方式。

因此,编译器将单个空格字符视为与单个 TAB 字符相同,即使 TAB 字符可能导致空格等效于最多八个空格。

4. 线路终结者

不同的平台有不同的行终止符字符。Java 不进入平台检测,并将文本块中的所有行终止符规范化为 。\n

如果需要平台线终结器,则可以使用。String::replaceAll("\n", System.lineSeparator())

String string = "Hello";
String textBlock = """
          World""";
 
String joinedString =  string + textBlock;
 
joinedString = joinedString.replaceAll("\n", System.lineSeparator());
 
System.out.println(joinedString);

5. 新的转义序列

5.1. 逃生线终结器

很多时候,我们只想将内容写入程序中的多行,但它们实际上是单个字符串内容。在这种情况下,我们可以使用行终止符转义字符,它是 单反斜杠 。它禁止包含隐式换行符。'\'

String dbSchema = """
  CREATE TABLE 'TEST'.'EMPLOYEE'\
  (\
  'ID' INT NOT NULL DEFAULT 0 ,\
  'FIRST_NAME' VARCHAR(100) NOT NULL ,
  'LAST_NAME' VARCHAR(100) NULL ,\
  'STAT_CD' TINYINT NOT NULL DEFAULT 0 \
  );
  """;
 
System.out.println(dbSchema);        

程序输出:

|CREATE TABLE 'TEST'.'EMPLOYEE'('ID' INT NOT NULL DEFAULT 0 ,'FIRST_NAME' VARCHAR(100) NOT NULL ,
'LAST_NAME' VARCHAR(100) NULL ,'STAT_CD' TINYINT NOT NULL DEFAULT 0 );

5.2. 向右剥离事件空间

如果由于某种原因我们不想去除缩进,我们可以使用(ASCII字符32,空格)转义序列。在任何行的末尾使用它可以保证该行将具有所有空格字符,直到遇到为止。'\s''\s'

String dbSchema =   """
  CREATE TABLE 'TEST'.'EMPLOYEE'          \s
  (                                       \s
    'ID' INT NOT NULL DEFAULT 0 ,         \s
     'FIRST_NAME' VARCHAR(100) NOT NULL , \s
    'LAST_NAME' VARCHAR(100) NULL ,       \s
    'STAT_CD' TINYINT NOT NULL DEFAULT 0  \s
  );                                      \s
  """;
 
System.out.println(dbSchema.replaceAll("\s", "."));

程序输出。在这个程序输出中,我用点替换了所有的空格字符,让你了解它的效果。'.'

CREATE.TABLE.'TEST'.'EMPLOYEE'...........
(........................................
..'ID'.INT.NOT.NULL.DEFAULT.0.,..........
...'FIRST_NAME'.VARCHAR(100).NOT.NULL.,..
..'LAST_NAME'.VARCHAR(100).NULL.,........
..'STAT_CD'.TINYINT.NOT.NULL.DEFAULT.0...
);.......................................

6. 最佳实践

  1. 仅当文本块可以提高代码的清晰度时才使用文本块,特别是对于多行字符串。
  2. 如果字符串适合用例,则始终首选使用字符串。它们更有利于应用程序性能。
  3. 要保持所需的缩进,请始终使用相对于内容上最后一行的位置关闭三重引号的位置。
  4. 避免在复杂表达式(如 lambda 表达式或操作)中使用内联文本块,以保持可读性。考虑重构为局部变量或静态最终字段。
  5. 仅使用空格或仅使用制表符来缩进文本块。混合空格将导致不规则缩进的结果。

在评论中给我您的问题。

快乐学习!!

引用:

打开JDK指南

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值