Философия Java



Данные final


Многие языки программирования имеют пути сообщить компилятору, что данный кусочек данных является неизменным, константой. Константа наиболее удобна для применения в следующих двух случаях:

  • Она должна быть константой во время компиляции и не может быть изменена никогда.
  • Она может быть инициализирована во время инициализации и не должна быть изменена после.
  • В случае константы во время компиляции компилятор свертывает константу до значения в любых вычислениях, где она используется; при этом, нагрузка при вычислениях во время работы программы может быть значительно снижена. В Java константы такого рода должны быть примитивного типа и объявлены с использованием final. Значение должно быть определено во время определения переменной, как и любой константы.

    Поля имеющие модификаторы static и final вообще являются ячейкой для хранения и не могут быть изменены.

    При использовании final с объектами, а не с примитивными типами получается несколько не тот эффект. С примитивами, final создает константу значения, а с объектами - ссылку, final создает ссылку - константу. Как только ссылка инициализируется на какой-то объект, она уже не может быть в последствии перенаправлена на другой объект. Однако сам объект может быть модифицирован; Java не предоставляет способа создать объект - константу. (Однако, Вы можете написать свой собственный класс с эффектом константы.) Эти же ограничения накладываются и на массивы, поскольку они тоже объекты.

    Ниже представлен пример, демонстрирующий использование полей с модификатором final:

    //: c06:FinalData.java

    // Эффект полей final.

    class Value { int i = 1; }

    public class FinalData { // Может быть константой во время компиляции

    final int i1 = 9; static final int VAL_TWO = 99; // Обычная public константы:

    public static final int VAL_THREE = 39; // Не может быть константой во время компиляции:

    final int i4 = (int)(Math.random()*20); static final int i5 = (int)(Math.random()*20);

    Value v1 = new Value(); final Value v2 = new Value(); static final Value v3 = new Value(); // Массивы:




    Содержание  Назад  Вперед