Инструмент форматирования Java
Что такое форматирование Java?
Java Formatter упорядочивает Java-код с едиными отступами, переносами строк и структурой, чтобы классы, методы, блоки, generics, аннотации и управляющий поток было легче читать. Он полезен для вставленных фрагментов, сгенерированного кода, подготовки ревью, учебных примеров и файлов, которые выглядят по-разному из-за настроек редакторов. Форматирование улучшает читаемость и командную работу, но не исправляет логику, ошибки компиляции, отсутствующие импорты, неверное использование API и правила стиля проекта. В production-репозиториях результат нужно сверять с formatter команды, build-инструментом или CI, чтобы не создавать лишний шум в diff. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.
Как использовать
Как использовать
- Вставьте или введите код Java в левое поле ввода
- Выберите размер отступа (2 пробела, 4 пробела или Tab)
- Нажмите «Форматировать» для улучшения читаемости кода или «Сжать» для минификации
- Просмотрите результаты справа (с подсветкой синтаксиса)
- Нажмите «Копировать» для копирования в буфер обмена
Описание параметров
Советы по коду
- Форматирование улучшает читаемость, но не компилирует и не проверяет типы в коде Java, поэтому после редактирования запускайте обычную сборку или проверки IDE.
- Минификация исходного кода Java редко полезна для продакшен-сборок: сохраняйте читаемое форматирование для ревью, трассировки стека и дальнейшей поддержки.
Применение
Технический принцип
Форматирование Java основано на лексическом анализе и построении AST. Лексический анализатор сканирует исходный код посимвольно и выдаёт токены: ключевые слова (class, public, static и другие зарезервированные слова), идентификаторы (имена переменных и классов), литералы (числа, строки, символы), операторы (+, -, ==, &&, ...), разделители ({ } ( ) ; ,) и комментарии (//, /* */). Синтаксический анализатор превращает поток токенов в абстрактное синтаксическое дерево (AST) в соответствии со спецификацией языка Java, распознавая определения классов, тела методов, блоки операторов, управляющие конструкции, аннотации и другие синтаксические единицы. Форматировщик обходит AST и генерирует код заново по руководству по стилю, например Google Java Style: отступ увеличивается с глубиной блока, ширина строки ограничена 100 символами, операторы окружаются пробелами, после запятых ставится пробел, а открывающие фигурные скобки остаются на той же строке (стиль K&R). Обработка аннотаций — особый случай в форматировании Java: одиночная аннотация остаётся на той же строке, что и метод; длинные списки аннотаций разбиваются по строкам с выравниванием по параметрам, каждая аннотация — на отдельной строке.
- Лексический анализ: распознавание 50 ключевых слов Java, идентификаторов, литералов, операторов и комментариев с выводом потока токенов.
- Построение AST: создание абстрактного синтаксического дерева по правилам JLS с корректной обработкой классов, методов, управляющих конструкций, лямбд и try-with-resources.
- Правила отступов: стиль Google использует 4 пробела на уровень по умолчанию с шириной строки 100 символов; строки, превышающие лимит, переносятся автоматически.
- Стратегия переноса: длинные цепочки методов, списки параметров и аннотации переносятся по запятым или точкам, а продолжение выравнивается по первому символу предыдущей строки.
- Обработка аннотаций: одиночная аннотация остаётся на той же строке; несколько аннотаций могут быть на одной строке или по одной на строку — решение зависит от длины и правил выравнивания параметров.
- Сохранение комментариев: комментарии // и /* */ остаются в оригинальных позициях; удаление доступно как опция при минификации.
Примеры
Форматирование определения класса
Вход: public class User{private Long id;private String name;public User(Long id,String name){this.id=id;this.name=name;}}
Выход:
public class User {
private Long id;
private String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
}Форматирование цепочки методов
Вход: List<String> result=list.stream().filter(s->s.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());
Выход:
List<String> result = list.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());Перенос аннотаций
Вход: @Override public ResponseEntity<User> getUser(@PathVariable Long id,@RequestParam(defaultValue="10") int size){...}
Выход:
@Override
public ResponseEntity<User> getUser(
@PathVariable Long id,
@RequestParam(defaultValue = "10") int size) {
...
}Часто задаваемые вопросы
Какой стиль Java используется?
Распространённые значения по умолчанию — Google Java Style или соглашения Sun/Oracle: отступ 4 пробела, расстановка скобок K&R, ширина строки 100 столбцов. В некоторых сборках есть опции переключения стилей. Точные правила любого стиль-гайда тонки — запустите форматирование, прочитайте результат и зафиксируйте конфигурацию.
Понимает ли форматер современный Java?
Зависит от версии парсера. Records, sealed-классы, switch-выражения, текстовые блоки и сопоставление с образцом — относительно новые возможности; старые парсеры могут их не поддерживать. Попробуйте кусочек кода: если он отформатировался чисто — всё в порядке; если выпадает с ошибкой — проверьте версию парсера.
Исправит ли он импорты или неиспользуемые переменные?
Нет. Форматирование меняет только пробелы и расстановку скобок. Статический анализ (упорядочивание импортов, удаление неиспользуемого) требует полноценной IDE или такого инструмента, как google-java-format с отключённым флагом --skip-removing-unused-imports.
Загружается ли мой исходный код?
Нет. Форматирование выполняется в браузере через JS-парсер Java. Код не передаётся. Тем не менее не вставляйте проприетарный код, если ваша политика безопасности запрещает использование любых веб-инструментов.
Совпадёт ли результат с форматированием IntelliJ или Eclipse?
Скорее всего, не точно. У каждой IDE свой форматер с тысячами опций. Используйте этот инструмент для разовых задач; для согласованности в команде применяйте инструмент с CI-проверкой — google-java-format или Spotless, встроенные в сборку.
Может ли он минифицировать Java?
Java — компилируемый язык, и минификация работает не так, как в JS. Оптимизацию class-файлов выполняют компиляторы и ProGuard на этапе сборки. Эта страница — только для форматирования исходников.
Почему в моём коде появляются дополнительные пустые строки?
Многие стиль-гайды требуют пустую строку между членами класса или между методами. Форматер вставляет их для соответствия. Если вы предпочитаете компактный код, переопределите соответствующие опции стиля.