Может ли IntelliJ преобразовать мою старую конкатенацию строк в новую функцию Text Block, предварительно просмотренную в Java 14? - PullRequest
3 голосов
/ 24 апреля 2020

У меня есть код, такой как этот:

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 предложит преобразование в текстовые блоки среди отображаемых элементов, когда я нажму на желтую лампочку, которая появляется рядом с этой строкой кода. Но я не вижу такого предложения.

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

Я удивлен, что не нашел такого предложения, поскольку компания JetBrains утверждает, что поддерживает JEP 368: текстовые блоки (второй просмотр) в их версии IntelliJ 2020.1, как обсуждено здесь и здесь .

➥ Предлагает ли IntelliJ какой-либо способ преобразования старой конкатенации строк в текстовые блоки?

1 Ответ

2 голосов
/ 24 апреля 2020

Раскрытие информации: разработчик 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
        );""";

Я подал выпуск , чтобы предложить преобразование, если только часть сцепления может быть преобразована в текстовый блок .

Альтернативное решение, которое фактически продвигается 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...