Может ли IntelliJ преобразовать мою старую конкатенацию строк в новую функцию текстового блока, предварительно просмотренную в 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 (предварительная версия) Ultimate edition, где параметры JDK настроены для уровня языка 14 (Preview) - Records, patters, text blocks
.
Поэтому я ожидал, что IntelliJ предложит преобразование в текстовые блоки среди отображаемых элементов, когда я нажимаю на желтую лампочку, которая появляется рядом с этой строкой кода. Но я не вижу такого предложения.
Я удивлен, что не нашел такого предложения, поскольку компания JetBrains утверждает, что поддерживает JEP 368: Text Blocks (Second Preview) в своей версии IntelliJ 2020.1, как обсуждается здесь и здесь.
➥ Предлагает ли IntelliJ способ преобразования старой конкатенации строк в текстовые блоки?
1 ответ
Раскрытие информации: разработчик 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
);""";
Я подал вопрос, чтобы предложить конверсию, если только часть конкатенации может быть преобразован в текстовый блок.
Альтернативное решение, которое фактически продвигает 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);