java - IntelliJ 可以将我的旧字符串连接转换为 Java 14 中预览的新文本 block 功能吗?

标签 java intellij-idea java-text-blocks

我有这样的现有代码:

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 在我单击此行代码旁边出现的黄色灯泡时,在项目显示中提供对文本块的转换。但我看不到这样的提议。

screen shot of pop-up menu displayed by clicking on yellow light bulb next to this line of code

我很惊讶没有找到这样的报价,因为 JetBrains 公司声称支持 JEP 368: Text Blocks (Second Preview)在他们的 2020.1 版本的 IntelliJ 中,正如所讨论的 herehere .

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

最佳答案

披露: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 screenshot

去掉括号后的结果是这样的:

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

我提交了 issue如果只有部分连接可以转换为文本块,则建议转换。

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()不建议(提交 another issue ),因此需要一些手动工作来转换它:

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);

关于java - IntelliJ 可以将我的旧字符串连接转换为 Java 14 中预览的新文本 block 功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398801/

相关文章:

Java 文本 block : Mix of Tabs and Spaces within Indentation Prefixes

java - StringIndexOutOfBound 异常

java - Java中如何获取Instrumentation实例

java - 从 CXF 拦截器确定目标服务/方法

java - 输入字段更改后的 Wicket 数据表过滤

java - IntelliJ IDEA Community Edition 中的 Spring 未绑定(bind) @Autowired

java - 使用 Intellij 启动 javaFx 应用程序失败

java - 如何设置 IntelliJ IDEA 14 以在可能的情况下添加 "final"关键字?