Соглашения об именовании в Java
Стандартные правила именования классов, методов, переменных, констант и пакетов Java, принятые в экосистеме.
Компилятор Java не заботится о том, как вы называете элементы, если соблюдаются правила для идентификаторов. Однако сообщество придерживается строгого набора соглашений об именовании, которые не менялись с момента выхода языка. Следование им делает ваш код понятным для любого читателя, а многие инспекции IDE и правила lint опираются на эти соглашения.
Соглашения вкратце
| Конструкция | Соглашение | Пример |
|---|---|---|
| Класс, интерфейс, перечисление, запись | UpperCamelCase | BankAccount, Order, Color |
| Метод, переменная, параметр, поле | lowerCamelCase | transferFunds, lineCount |
Константа (static final) | UPPER_SNAKE_CASE | MAX_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.guavaorg.apache.commons.lang3com.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.
Демонстрация
Каждое имя здесь соответствует стандартному соглашению: класс — в стиле UpperCamelCase, константа — UPPER_SNAKE_CASE, переменные — lowerCamelCase, булево значение — в форме предиката.
Что дальше
Типы данных Java знакомит с примитивными и ссылочными типами Java — строительными блоками, из которых состоят все переменные.