W3docs

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

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

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

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

JVM выполняет int X=1;if(X>0){return"a";} ровно с той же скоростью, что и хорошо отформатированный код. Соглашения существуют для людей: код читают гораздо чаще, чем пишут, а единый стиль устраняет один из слоёв трений при каждом прочтении. Второй практический выигрыш — чистота диффов: когда все форматируют одинаково, 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 и именование их в верхнем регистре со знаком подчёркивания сигнализирует каждому читателю с первого взгляда: «это никогда не изменится» — соглашение кодирует намерение, которое компилятор не может передать.
  • grossPrice(100.00) = 120.00 получено от метода, чьё имя в camelCase читается как инструкция. Параметр netPrice и использование TAX_RATE в теле делают вычисление самодокументирующимся; вы понимаете его без комментария.
  • grades = [A, B, C] формируется методом classify, написанным в стиле скобок K&R с явными скобками на каждой ветке — даже на однострочных. Именно эти скобки не дают последующему редактированию случайно создать «повисший оператор».
  • total name length = 10 получено из расширенного цикла for по List<String>, объявленному с типом интерфейса слева, а не ArrayList. Программирование на интерфейс — соглашение, которое позволяет остальному коду свободно менять реализации.
  • totalLength is even показывает boolean, названный как вопрос (isEven), питающий короткий однозначный тернарный оператор. Подобные соглашения незаметны, когда соблюдаются, и режут глаз, когда нарушаются — именно поэтому команды автоматизируют их.

Что охватывает остальная часть этого раздела

Соглашения — это поверхностный слой; следующие главы движутся от того, как код выглядит, к тому, как он структурирован:

Практика

Практика
Ваша команда проверяет pull request, и кто-то объявляет значение конфигурации как 'private static final int maxRetries = 3;'. Следуя стандартным соглашениям Java, в чём проблема?
Ваша команда проверяет pull request, и кто-то объявляет значение конфигурации как 'private static final int maxRetries = 3;'. Следуя стандартным соглашениям Java, в чём проблема?
Was this page helpful?