Ответ
Константа в Java — это переменная, значение которой не может быть изменено после инициализации. Для объявления используется ключевое слово final.
Особенности и правила
finalпеременная: Должна быть явно инициализирована один раз — при объявлении, в блоке инициализации или в каждом конструкторе (для нестатических).- Константа времени компиляции: Если
finalпеременная примитивного типа илиStringинициализируется литералом или константным выражением, её значение может быть встроено (inline) в код на этапе компиляции. - Соглашение об именовании: Для
public static finalполей (констант класса) принято использоватьUPPER_SNAKE_CASE.
Примеры
public class AppConstants {
// Константа класса (статическая)
public static final double PI = 3.14159;
public static final int MAX_CONNECTIONS = 100;
public static final String START_DATE = "2024-01-01";
// Нестатическая final-переменная (константа экземпляра)
private final int instanceId;
public AppConstants(int id) {
this.instanceId = id; // Инициализация в конструкторе
}
// final для ссылочного типа
private final List<String> immutableList = new ArrayList<>();
// Ссылку изменить нельзя, но состояние объекта — можно!
void addItem(String item) {
immutableList.add(item); // Это допустимо
// immutableList = new ArrayList<>(); // Ошибка компиляции
}
}
Важно: Для создания неизменяемых коллекций используйте Collections.unmodifiableList() или иммутабельные коллекции из сторонних библиотек.
Ответ 18+ 🔞
А, константы в Java, да? Ну это ж классика, блядь! Ситуация, когда ты говоришь переменной: «Всё, сука, точка. С этого момента ты — закон. Ни шагу в сторону, ни байта вправо, ни байта влево». И она, такая, стоит и бздит от страха, потому что компилятор — это тот ещё надзиратель, ёпта.
Вот смотри, чтобы объявить эту несгибаемую твердыню, нужно ключевое слово final. Без него — это просто предложение, а не приказ, понимаешь?
Нюансы, от которых волосы дыбом
final-переменная: Её нужно проинициализировать РОВНО ОДИН РАЗ. Как? Да как угодно: сразу, в каком-нибудь блоке инициализации, или в каждом конструкторе (если она неstatic). Главное — один раз, и потом хоть тресни.- Константа компиляторного разлива: Вот это прикол! Если твоя
final-переменная — примитив илиString, и ей присваиваешь прямо вот литерал или выражение из других констант, то компилятор, такой хитрожопый, может просто взять и вшить её значение прямо в байт-код. На этапе компиляции! Никаких обращений в рантайме. Красота, блядь. - Как её зовут?: Если константа
public static final(то есть всеобщее достояние, ёба), то её имя пишут заглавными буквами, а слова разделяют подчёркиванием.UPPER_SNAKE_CASE, понимаешь? Чтобы сразу было видно — это нечто сакральное, на что нельзя даже косо посмотреть.
Примеры для особо одарённых
public class AppConstants {
// Вот она, святая святых — константа класса (статическая)
public static final double PI = 3.14159; // Хуй с горы, Архимед отдыхает
public static final int MAX_CONNECTIONS = 100; // Больше сотни — пиздец серверу
public static final String START_DATE = "2024-01-01"; // С этой даты всё и началось
// А это нестатическая final-переменная. У каждого экземпляра — своя неизменная печать!
private final int instanceId;
public AppConstants(int id) {
this.instanceId = id; // Проинициализировал в конструкторе — и всё, приплыли.
}
// А вот это, блядь, ловушка для молодых и глупых! final для ссылочного типа.
private final List<String> immutableList = new ArrayList<>();
// САМУ ССЫЛКУ менять нельзя. НО! Состояние объекта, на который она указывает — пожалуйста!
void addItem(String item) {
immutableList.add(item); // Это работает! Мы же ссылку не меняем, мы список внутри мутим.
// immutableList = new ArrayList<>(); // А вот это уже НЕТ, ёпта! Компилятор тебе ебальник набьёт.
}
}
И главное, запомни нахуй: final List — это НЕ неизменяемый (immutable) список! Это список, на который зафиксирована ссылка. Чтобы сделать его по-настоящему неприкосновенным, нужно Collections.unmodifiableList() или специальные библиотечные штуки. А то будешь как тот Герасим, который думал, что всё контролирует, а потом — пиздец, Муму утонула.