W3docs

Соглашения о написании кода в Java

Стандартные соглашения о написании кода в Java — форматирование, стиль скобок, длина строки и признанные руководства по стилю.

Соглашения о написании кода в Java

Соглашения о написании кода — это общие правила, благодаря которым код Java выглядит так, будто его написал один человек, даже когда к нему прикасается команда из пятидесяти. Они охватывают именование, отступы, расстановку скобок, длину строки и структуру файла — компилятору ни до чего из этого нет дела, но всё это решает, сможет ли следующий читатель (часто вы сами, месяцы спустя) окинуть метод взглядом за секунды или ему придётся её расшифровывать. У Java необычайно сильные соглашения, потому что они были опубликованы рано, в исходных Code Conventions for the Java Programming Language от Sun, и с тех пор остаются на удивление стабильными.

Почему соглашения важнее компилятора

JVM выполняет int X=1;if(X>0){return"a";} ровно с той же скоростью, что и хорошо отформатированный код. Соглашения существуют для людей: код читают гораздо чаще, чем пишут, и единообразный стиль снимает слой трения при каждом чтении. Второй, практический выигрыш — это гигиена diff: когда все форматируют одинаково, diff системы контроля версий показывает реальные изменения логики вместо шума переформатирования. Большинство команд автоматически принуждают к единому стилю (с помощью форматтера) именно для того, чтобы стиль перестал быть предметом обсуждения при ревью кода.

Именование: соглашение, которое вы используете в каждой строке

Имена несут почти весь смысл программы, и правила именования в Java почти универсальны по всей экосистеме:

ЭлементСоглашениеПример
Класс / интерфейс / перечислениеPascalCase, существительноеOrderService, HttpClient
МетодcamelCase, глагольная фразаparseDate, isEmpty
Поле / локальная переменнаяcamelCase, существительноеretryCount, userName
Константа (static final)UPPER_SNAKE_CASEMAX_RETRIES, DEFAULT_PORT
Параметр типаодна заглавная букваT, K, V, E
Пакетвсё строчными, через точкуcom.example.billing
public class InvoiceCalculator {        // PascalCase class
  private static final int MAX_ITEMS = 100;  // UPPER_SNAKE_CASE constant
  private int lineCount;                 // camelCase field

  public boolean isOverLimit() {         // camelCase verb, boolean reads as a question
    return lineCount > MAX_ITEMS;
  }
}

Избегайте сокращений, не являющихся отраслевым стандартом (accelerationTime, а не accTime), и пусть длина имени соответствует его области видимости — индекс цикла может быть i, но поле, живущее всё время жизни объекта, заслуживает целого слова.

Форматирование: скобки, отступы и длина строки

Java подавляюще использует стиль скобок K&R: открывающая скобка стоит в той же строке, что и объявление, а закрывающая скобка выравнивается под началом этой инструкции. Стандартный отступ — 4 пробела (в официальных руководствах никогда табы), а строки удерживаются в разумной ширине — классическим пределом были 80 столбцов; современные руководства, например от Google, используют 100.

// K&R: opening brace on the same line, always use braces
if (user.isActive()) {
  sendWelcome(user);
} else {
  queueReminder(user);
}

// Even a one-line body gets braces — it prevents the classic "dangling statement" bug
for (Order order : orders) {
  total += order.amount();
}

Несколько правил, предотвращающих самые частые замечания при ревью: одна инструкция на строку, одна пустая строка между методами, пробел после ключевых слов (if (, а не if() и никаких пробелов в конце строки.

Признанные руководства по стилю

Вы редко изобретаете соглашения с нуля — вы принимаете опубликованное руководство и позволяете инструменту его соблюдать:

РуководствоОтступШирина строкиПримечания
Oracle/Sun Code Conventions4 пробела80Оригинал; основополагающее, но устаревшее
Google Java Style Guide2 пробела100Широко принято; поддержано инструментом google-java-format
Android (AOSP)4 пробела100На основе Google, подстроено под Android

Конкретное руководство важно меньше, чем выбор одного и его последовательное применение. Инструменты вроде Checkstyle (проверяет стиль и проваливает сборку при нарушениях), Spotless и google-java-format (автоформатирование при сохранении или коммите), а также форматтеры IDE полностью убирают человеческий фактор.

Разобранный пример: правила соглашений в работающем коде

Компилятор слеп к стилю, поэтому запускаемая программа не может напрямую «проверить» форматирование. Что она может — это применить правила именования и структуры в реальном коде — константы, методы в camelCase, скобки K&R, переменные с типом интерфейса — и напечатать результаты, доказывающие, что каждая часть выполняет свою работу.

java— editable, runs on the server

Что вынести из запуска:

  • MAX_RETRIES constant = 3 показывает константу UPPER_SNAKE_CASE в действии. Объявление значений как private static final и их именование в верхнем-snake-case с первого взгляда сигнализирует каждому читателю «это никогда не меняется» — соглашение кодирует намерение, которое компилятор выразить не может.
  • grossPrice(100.00) = 120.00 пришло из метода, чьё глагольное имя в camelCase читается как инструкция. Параметр netPrice и использование TAX_RATE в теле делают расчёт самодокументируемым; вы понимаете его без комментария.
  • grades = [A, B, C] создаётся методом classify, написанным в стиле скобок K&R с явными скобками в каждой ветви — даже в однострочных ветвях с return. Эти скобки не дают позднейшей правке случайно создать «висячую инструкцию».
  • total name length = 10 исходит из расширенного цикла for по List<String>, объявленной с типом интерфейса слева, а не ArrayList. Программирование на интерфейс — это соглашение, оставляющее остальной части кода свободу менять реализации.
  • totalLength is even показывает булево значение, названное как вопрос (isEven), питающее короткий, одноцелевой тернарный оператор. Соглашения вроде этих невидимы, когда им следуют, и режут глаз, когда их нарушают — именно поэтому команды их автоматизируют.

Что охватывает остальная часть этой части

Практики чистого кода, эффективное именование, неизменяемость, шаблоны обработки ошибок и принципы проектирования (SOLID, DRY), которые строятся на этом фундаменте. Соглашения — это поверхностный слой; следующие главы переходят от того, как код выглядит, к тому, как он структурирован.

Practice

Практика

Your team is reviewing a pull request and someone declares a configuration value as 'private static final int maxRetries = 3;'. Following standard Java coding conventions, what is the issue?