Типичная проблема, с которой сталкиваются новички в Java — понимание работы ключевого слова final
. В Java это ключевое слово используется для того, чтобы указать, что значение переменной не должно меняться. Но есть нюансы, которые могут запутать новичка. Рассмотрим пример.
import java.util.ArrayList; import java.util.List; class Test { private final List foo; public Test() { foo = new ArrayList(); foo.add("foo"); } public static void main(String[] args) { Test t = new Test(); t.foo.add("bar"); System.out.println("print - " + t.foo); } }
В этом коде используется ключевое слово final
для переменной foo
. И, несмотря на это, в конструкторе класса и в main
методе к этому списку добавляются элементы. Код работает и не вызывает ошибок компиляции.
Теперь давайте попробуем изменить переменную на static
:
private static final List foo;
И в этом случае мы увидим ошибку компиляции. Почему так происходит? Как на самом деле работает final
?
Когда мы объявляем переменную как final
, это означает, что ссылка на объект, которую эта переменная содержит, не может быть изменена. Это не значит, что мы не можем изменить сам объект — мы можем добавлять элементы в список, удалять их и так далее. Это разрешено, потому что мы не меняем ссылку на объект, мы меняем состояние объекта.
Когда мы объявляем переменную как static final
, она становится константой. Это означает, что ссылка на объект не может быть изменена, и значение должно быть присвоено при объявлении или в статическом блоке инициализации. После этого значение не может быть изменено.
В обоих случаях важно понимать, что final
не делает объекты неизменяемыми. Он просто гарантирует, что ссылка, сохраненная в final
переменной, останется постоянной.
Добавить комментарий