Может ли 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);
Другие вопросы по тегам