Что такое константа в Java?

Ответ

Константа в 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() или специальные библиотечные штуки. А то будешь как тот Герасим, который думал, что всё контролирует, а потом — пиздец, Муму утонула.