W3docs

Соглашения об именовании в Java

Стандартные правила именования классов, методов, переменных, констант и пакетов Java, принятые в экосистеме.

Компилятор Java не заботится о том, как вы называете элементы, если соблюдаются правила для идентификаторов. Однако сообщество придерживается строгого набора соглашений об именовании, которые не менялись с момента выхода языка. Следование им делает ваш код понятным для любого читателя, а многие инспекции IDE и правила lint опираются на эти соглашения.

Соглашения вкратце

КонструкцияСоглашениеПример
Класс, интерфейс, перечисление, записьUpperCamelCaseBankAccount, Order, Color
Метод, переменная, параметр, полеlowerCamelCasetransferFunds, lineCount
Константа (static final)UPPER_SNAKE_CASEMAX_RETRIES, DEFAULT_TIMEOUT
Пакетвсе строчные, через точкуcom.example.billing
Параметр типаодна заглавная букваT, E, K, V

Примеры в коде:

package com.example.billing;

public class InvoicePrinter {
    public static final int MAX_LINE_WIDTH = 80;

    private int lineCount;

    public void print(Invoice invoice) {
        for (LineItem item : invoice.getItems()) {
            renderLine(item);
        }
    }

    private void renderLine(LineItem item) { ... }
}

Классы, интерфейсы, перечисления, записи

Используйте UpperCamelCase — каждое слово начинается с заглавной буквы, разделители не используются:

  • Customer, OrderRepository, HttpClient, XmlParser (аббревиатуры обычно трактуются как слова: Http, Xml)

Трактовка аббревиатур как слов сохраняет читаемость границ: parseHttpUrl воспринимается легче, чем parseHTTPURL, где три подряд идущих заглавных буквы сливаются. В самом JDK здесь есть непоследовательность (HttpURLConnection появился до принятия соглашения), поэтому, если сомневаетесь, следуйте стилю окружающего кода.

Имена классов должны быть существительными: Order, Connection, BankAccount.

Интерфейсы также именуются в стиле UpperCamelCase. Два распространённых шаблона именования:

  • Прилагательное с суффиксом -able (или его аналогом): Comparable, Runnable, Serializable.
  • Существительное, называющее роль: List, Repository, Connection.

Избегайте старого венгерского префикса I (ICustomer) — в Java-коде так не делают. Правило UpperCamelCase применяется и к перечислениям, и к интерфейсам.

Методы и переменные

Используйте lowerCamelCase: первое слово строчными буквами, каждое последующее — с заглавной:

  • calculateTotal, parseDate, getUserName, index, lineCount.

Имена методов должны быть глаголами или глагольными словосочетаниями:

  • save, findById, validate, parseJson.

Распространённые глагольные префиксы:

  • get / set — геттер и сеттер.
  • is / has / can — возвращают boolean: isEmpty, hasNext, canExecute.
  • to — возвращает преобразованную форму: toString, toUpperCase.
  • from — фабричный метод: LocalDate.from(temporal).

Имена переменных должны описывать, что представляет значение, а не как оно используется. Предпочитайте customer вместо obj, lineCount вместо n. Однобуквенные имена допустимы для индексов в циклах (i, j) и коротко живущих локальных переменных, где тип очевиден (var p = new Point(...)).

Константы

Константа — это поле с модификатором static final. Используйте UPPER_SNAKE_CASE:

public static final int MAX_RETRIES = 3;
public static final String DEFAULT_GREETING = "Hello";
public static final Duration TIMEOUT = Duration.ofSeconds(30);

Локальные переменные final (однократные привязки внутри метода) константами в том же смысле НЕ являются — для них используйте lowerCamelCase:

public void process(Order o) {
    final int maxAttempts = 3;   // not MAX_ATTEMPTS
    ...
}

Пакеты

Имена пакетов пишутся полностью строчными буквами, разделяются точками. Принятое в сообществе соглашение — использовать перевёрнутое доменное имя, которым вы владеете:

  • com.google.guava
  • org.apache.commons.lang3
  • com.example.billing.invoices

Избегайте подчёркиваний и заглавных букв в именах пакетов — это считается нестандартным.

Параметры типа

Параметры обобщённых типов обычно представляются одной заглавной буквой. Устоявшиеся соглашения:

  • T — тип (общий)
  • E — элемент (в коллекции)
  • K — ключ
  • V — значение
  • R — тип возвращаемого значения
  • S, U — второй, третий параметр типа при наличии нескольких
public interface List<E> { ... }
public interface Map<K, V> { ... }
public interface Function<T, R> { ... }

Для сложных API, где одна буква неочевидна, используйте описательное имя в стиле UpperCamelCase с суффиксом T: RequestT, ResponseT. Это редкость.

Булевы значения

Имена булевых переменных и методов обычно формулируются как предикаты:

  • isActive, hasNext, canExecute, shouldRetry.

Избегайте отрицательных имён типа isNotEmpty — они плохо читаются в сочетании с !.

Антипаттерны именования

  • Однобуквенные имена вне короткого цикла: int s = 100 ни о чём не говорит.
  • Венгерская нотация: strName, iCount — Java статически типизирована, IDE показывает тип.
  • Числовые суффиксы: total1, total2, processData2. Если нужны два — найдите реальное различие в именах.
  • UPPER_SNAKE_CASE для всего, что помечено final: такой стиль применяется только к настоящим константам уровня модуля.
  • Непоследовательный регистр у соседних элементов: если один метод называется getUserId, соседний не должен называться get_email.

Демонстрация

java— editable, runs on the server

Каждое имя здесь соответствует стандартному соглашению: класс — в стиле UpperCamelCase, константа — UPPER_SNAKE_CASE, переменные — lowerCamelCase, булево значение — в форме предиката.

Что дальше

Типы данных Java знакомит с примитивными и ссылочными типами Java — строительными блоками, из которых состоят все переменные.

Практика

Практика
Какое имя соответствует стандартному соглашению Java для константы?
Какое имя соответствует стандартному соглашению Java для константы?
Was this page helpful?