IntelliJ 能否将我的旧字符串连接转换为 Java 14 中预览的新文本块功能?
Can IntelliJ convert my old string concatenation to new Text Block feature previewed in Java 14?
我有这样的现有代码:
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 公司声称支持 JEP 368: Text Blocks (Second Preview) in their 2020.1 version of IntelliJ, as discussed here and here。
➥ 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
字符上转换:
去掉括号后的结果是这样的:
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 提倡的替代解决方案是使用字符串格式。首先,使用意图操作 "Replace '+' with '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);
我有这样的现有代码:
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 公司声称支持 JEP 368: Text Blocks (Second Preview) in their 2020.1 version of IntelliJ, as discussed here and here。
➥ 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
字符上转换:
去掉括号后的结果是这样的:
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 提倡的替代解决方案是使用字符串格式。首先,使用意图操作 "Replace '+' with '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);