5

我有这样的现有代码:

String sql = "CREATE TABLE " + tableName + " (\n" +
        "  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
        "  when_ TIMESTAMP WITHOUT TIME ZONE NOT NULL\n" +
        "  duration_ STRING NOT NULL\n" +
        ");";

…在 IntelliJ 2020.1.1(预览版)终极版的项目中,其中 JDK 设置配置为语言级别14 (Preview) - Records, patters, text blocks

因此,当我单击出现在这行代码旁边的黄色灯泡时,我希望 IntelliJ 能够在显示的项目中提供文本块的转换。但我没有看到这样的提议。

通过单击此代码行旁边的黄色灯泡显示的弹出菜单的屏幕截图

我很惊讶没有找到这样的提议,因为 JetBrains 公司声称在其 IntelliJ 的 2020.1 版本中支持JEP 368: Text Blocks (Second Preview) ,如此处和此处所讨论

➥ IntelliJ 是否提供了一些将旧字符串连接转换为文本块的方法?

4

1 回答 1

6

披露:IntelliJ IDEA 开发人员在这里。


目前,IntelliJ IDEA 仅建议将完整的文字串联转换为文本块。但是,在这里,您有一个涉及tableName变量的串联。这会阻止检查的开始。您可以解决这个添加虚假括号的问题:

String sql = "CREATE TABLE " + tableName + (" (\n" +
             "  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
             "  when_ TIMESTAMP WITHOUT TIME ZONE NOT NULL\n" +
             "  duration_ STRING NOT NULL\n" +
             ");");

之后,建议在第一个\n字符上进行转换:

IntelliJ IDEA 截图

去掉括号后的结果如下:

String sql = "CREATE TABLE " + tableName + """
         (
          id_ UUID DEFAULT random_uuid() PRIMARY KEY ,
          when_ TIMESTAMP WITHOUT TIME ZONE NOT NULL
          duration_ STRING NOT NULL
        );""";

如果只有部分连接可以转换为文本块,我提出了一个建议转换的问题。

JDK 提倡的另一种解决方案是使用字符串格式化。首先,使用意图操作“将 '+' 替换为 'String.format()'”(可通过​​ Alt+Enter 在串联内的任何位置使用)。结果如下所示:

String sql = String
    .format("CREATE TABLE %s (\n  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n  when_ TIMESTAMP WITHOUT TIME " +
            "ZONE NOT NULL\n  duration_ STRING NOT NULL\n);", tableName);

现在立即建议使用文本块,结果如下所示:

String sql = String.format("""
        CREATE TABLE %s (
          id_ UUID DEFAULT random_uuid() PRIMARY KEY ,
          when_ TIMESTAMP WITHOUT TIME ZONE NOT NULL
          duration_ STRING NOT NULL
        );""", tableName);

.formatted()不幸的是,不建议使用新的实例方法(提交另一个问题),因此需要一些手动工作来转换它:

String sql = """
        CREATE TABLE %s (
          id_ UUID DEFAULT random_uuid() PRIMARY KEY ,
          when_ TIMESTAMP WITHOUT TIME ZONE NOT NULL
          duration_ STRING NOT NULL
        );""".formatted(tableName);
于 2020-04-24T02:56:16.060 回答