Где может использоваться модификатор final

от admin

Модификатор final в Java

Модификатор final — это способ, с помощью которого вы можете контролировать работу своей программы и ее составных частей. Это один из Ваших инструментов:

Суть модификатора final — сделать дальнейшее изменение объекта невозможным. С английского «final» можно перевести как «последний, окончательный»:

Вы можете применять этот модификатор тремя способами: для класса, для поля (переменной) и для метода.

final_3
Final для полей

Если вы хотите, чтобы после инициализации никто не мог бы изменить вашу переменную, напишите слово «final»:

final Keyword in Java

Modifiers are specific keywords present in Java using that we can make changes to the characteristics of a variable, method, or class and limit its scope. Java programming language has a rich set of Modifiers.

Modifiers in Java are divided into two types Access Modifiers and Non-Access modifiers.

Non-Access modifiers

Non-access modifiers provide information about the characteristics of a class, method, or variable to the JVM. Seven types of Non-Access modifiers are present in Java. They are –

  1. final
  2. static
  3. abstract
  4. synchronized
  5. volatile
  6. transient
  7. native

This article will go into the details of the final keyword. Let’s explore first, why do we use it, when should we use it if we decide to, and last but not least, how to use it.

the WHY:

The final keyword in Java can be used for different purposes. Most commonly, it is used to create immutable objects. This means that once an object is created, it cannot be modified. This can be useful for creating objects that need to be thread-safe or when you want to ensure that data is not modified accidentally.

final also has uses beyond creating immutable objects. It can also be used to prevent inheritance or to make a class static. In short, the final keyword is a versatile tool that can be used in a variety of ways. While it is not always necessary to use final, it can be helpful in certain situations.

the WHEN and HOW:

1. Java final Variable

A variable cannot have its value modified after initialization if it is defined using the final keyword. Keep in mind that initializing a variable is not always required at the moment of declaration.

In the above gist, we tried to declare a final variable CLAPS to an initial value of 100, then when we tried to change it, we will see we get a compilation error with the following message.

2. Java final Method

A method, declared with the final keyword, cannot​ be overridden or hidden by subclasses.

In the above gist, we tried overriding the randomMethod which is a final method, inside another class.

We will see that when we try to run the code, we will get, again, a compilation error.

3. Java final Class

A class marked as final can extend another class, however a final class cannot be extended.

In the above gist, we have created a final class named FinalClass. Here, we have tried to inherit the final class by the Main class.

When we run the program, we will get a compilation error with the following message.

4. Java final Parameter

If you ever see the final keyword with a parameter variable, it means that the value of this variable cannot be changed anywhere in the method.

Читать:
Где лучше рисовать uml

In the above gist, we tried to change the value of x, which is a final parameter.
If we run the code, we will see a compilation error saying that we cannot assign different values to final parameters.

Knowing best why, how and when to use final, as well as other modifiers, comes with experience, and experience comes with time.

Что означает модификатор final в полях классов?

Я заметил, что профессиональные разработчики нередко объявляют поля классов в джаве как final, например:

Для чего это делается? Я видел, как в проекте final объявляются не только поля сервисов и репозиториев, но и поля дата-классов. Расскажите об этом больше, пожалуйста.

default locale's user avatar

  1. Удобно чисто визуально. Если видишь, что переменная final , то точно знаешь, что она не будет меняться.
  2. Без final никак, если ты локальную переменную собираешься использовать в анонимных классах/замыканиях.
  3. final — это подсказка компилятору. Если он видит финальные поля, то может произвести определённые оптимизации кода.

Suvitruf - Andrei Apanasik's user avatar

Многа букав: По-умолчанию ставятся максимальные ограничения. Снимать ограничение (final) с поля имеет смысл только если на это есть причина (поле изменяется).

С помощью final отмечаются поля, которые инициализируются только один раз. Отмечать такое поле как final технически необязательно, но если этого не сделать, то:

  • останется возможность ошибки: разработчик опечатается и переприсвоит значение;
  • при чтении кода возникнут вопросы: «Где это поле изменяется? И как это повлияет на остальной код?». Модификатор final говорит разработчику что лишние сценарии рассматривать не требуется.

Вообще значительная часть программирования это расстановка ограничений. Чем меньше операций можно выполнить с кодом — тем легче о нем рассуждать — тем проще проверить его правильность. Поэтому разработчики стараются устанавливать для полей/переменных максимально жесткие ограничения, чтобы снизить количество возможных сценариев их использования.

По аналогичной причине поля, которые не используются вне класса, объявляются как private . Поле с доступом по-умолчанию оставит лишние сценарии использования и, вместе с ними, простор для ошибок и вопросов («Из какого класса к нему идет обращение и зачем?»).

Многие IDE и средства анализа кода (например, PMD) отслеживают поля и переменные, которые могут быть отмечены как final и выдают соответствующие предупреждения.

На практике поля, как важную часть классов, везде где возможно отмечают как final. На локальных переменных и аргументах методов же обычно «экономят», т.к. срок жизни у них короче и риск побочных эффектов меньше. Для них наоборот используют final только там где это явно необходимо (использование в анонимных классах). Например, в Вашем коде аргументы конструктора ( userRepository ) и метода ( link ) могли бы быть отмечены как final , но не отмечены для простоты кода.

Вот так final…

Что можно сказать про массив, когда он объявлен final ?

Известно, что класс String — immutable , класс объявлен final , значение строки хранится в массиве char , который отмечен ключевым словом final .

Т.к. массив – это объект, то final означает, что после присвоения ссылки на объект, уже нельзя ее изменить, но можно изменять состояние объекта.

Да, можно. Ключевой момент – это понимание использования колючего слова final с объектами. Для подмены значения использует ReflectionAPI.

Похожие статьи