Получить доступ

Что такое текстовый блок и как в нём работают отступы?

MiddleСовременная JavaJava >=15
Ещё спрашивают так:
  • Что такое текстовый блок ("""…""", Java 15)?
Коротко

Многострочный литерал в тройных кавычках: JSON, SQL, HTML без экранирования и конкатенации. Результат — обычная String. Общий отступ (по самой левой строке и закрывающим кавычкам) срезается, хвостовые пробелы удаляются.

  • Сдвиг закрывающих кавычек влево добавляет отступ в результат
  • \ в конце строки — склеить строки без перевода
  • \s — сохранить пробел

А ещё Интерполяции нет: formatted() или String.format

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Правило отступа стоит понимать точно: компилятор находит минимальный отступ среди непустых строк и позиции закрывающих кавычек, после чего срезает его — поэтому сдвиг закрывающих кавычек влево добавляет отступ в результат. Хвостовые пробелы удаляются всегда, и если они нужны, их защищают через \s. Интерполяции в языке нет, поэтому значения подставляют через formatted() или String.format. Текстовые блоки удобны для SQL, JSON и HTML в тестах, но важно помнить, что это по-прежнему обычная строка: никакого экранирования для SQL они не делают, и параметризованные запросы никто не отменял.

Пример

String sql = """
    SELECT id, name
    FROM users
    WHERE status = '%s'
    """.formatted(status);

Что хотят услышать

  • Назначение.
  • Правило отступов.
  • Отсутствие интерполяции.

Частые ошибки

  • Ожидать интерполяции переменных внутри блока.
  • Собирать SQL текстовым блоком с подстановкой значений вместо параметров.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Общий отступ (incidental white space) удаляется автоматически, а его величину задаёт в том числе положение закрывающих кавычек
  • ✓Обратный слэш в конце строки убирает перевод строки, позволяя разбить длинную строку в коде
  • ✓Последовательность \s сохраняет пробел, который иначе был бы удалён как хвостовой
  • ✗Внутри текстового блока подставляются значения переменных, как в шаблонных строках

Что спросят дальше

  • Как положение закрывающих кавычек меняет результат?
  • Чем formatted() удобнее String.format в этом контексте?
  • Что такое incidental whitespace?
  • Как блок ведёт себя с завершающим переводом строки?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем