Вопрос №664 от пользователя Михаил Соколовский в уроке «Модуль 5. Урок 3. Неизменяемые объекты.», курс «Введение в Java»

Михаил Соколовский

Разве в этом задании существенно наличие атрибута final?

public class Player {
   String lvl = "0";

  public static void main(String[] args) {
    Player p1 = new Player();
    setPl(p1);
    System.out.println(p1.lvl);
  }

  static void setPl(Player p) {
    final Player p1 = new Player();
    p = p1;
    p.lvl = "1";

  }
} 
5 0

Глеб Бочкарёв

final — прежде всего защита от самого себя.

Дело в том, что хорошие компиляторы «умнее» людей. Компилятор может легко пробежаться по коду и выяснить, изменяется ли переменная в методе, и сам применить нужные оптимизации, если считает нужным. Время «подсказок компилятору» на нормальных платформах прошло.

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

3

Михаил Соколовский

Спасибо за развернутый комментарий!

Может ли переменная с атрибутом final меняться в зависимости от экземпляра (instance) класса, т.е. иметь разные значения для каждого конкретного объекта?

0

Вячеслав Ковалевский

Если поле класса final но не static то значение этого поля может отличатся в каждом экземпляре класса, но в то же время в каждом экземпляре класса оно не может изменятся со временем жизни экземпляра класса.

1

Dmitry Protopopov

Доброго времени суток. В этом тестовом задании поле класса же не имеет атрибута final.

0

Вячеслав Ковалевский

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

1

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 1 июня
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 1 июня
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 1 июня
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 1 июня
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 1 июня
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 1 июня
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 1 июня
профессия
от 10 080 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 1 июня
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 1 июня
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время
профессия
от 6 300 ₽ в месяц
новый
Автоматизированное тестирование веб-приложений на JavaScript
10 месяцев
с нуля
в разработке
дата определяется