Вопрос №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";
}
}
final — прежде всего защита от самого себя.
Дело в том, что хорошие компиляторы «умнее» людей. Компилятор может легко пробежаться по коду и выяснить, изменяется ли переменная в методе, и сам применить нужные оптимизации, если считает нужным. Время «подсказок компилятору» на нормальных платформах прошло.
А вот защититься от собственных глупых ошибок — например, чтобы случайно не изменить переменную, которую вовсе не нужно менять — хорошая идея. Если вы случайно измените final-переменную, компилятор немедленно подскажет вам об этом. Поэтому имеет смысл не задумываясь ставить final везде, где переменная не должна меняться, не отвлекаясь на то, как в данный момент реализован метод.
Спасибо за развернутый комментарий!
Может ли переменная с атрибутом final меняться в зависимости от экземпляра (instance) класса, т.е. иметь разные значения для каждого конкретного объекта?
Если поле класса final но не static то значение этого поля может отличатся в каждом экземпляре класса, но в то же время в каждом экземпляре класса оно не может изменятся со временем жизни экземпляра класса.
Доброго времени суток. В этом тестовом задании поле класса же не имеет атрибута final.
Поле класса - нет (иначе бы код не скомпилировался). Единственное место где используется ключевое слово final это локальная переменная (хотя как уже было замечено это не влияет на вопрос)
Используйте Хекслет по-максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт