В одной статье наткнулась на следующие строки:
Элементы enum Season (WINTER, SPRING и т.д.) - это статически
доступные экземпляры enum-класса Season. Их статическая доступность
позволяет нам выполнять сравнение с помощью оператора сравнения ссылок
==.
А каким образом статическая доступность позволяет выполнять сравнение с помощью оператора сравнения ссылок ==? Почему нестатические объекты сравнивать через == нельзя, а статические можно?
Ответ
При сравнению через == сравниваются указатели, а статические поля класса одинаковы для всех экземпляров класса - указатели на них определяются в момент запуска программы. Если поле финальное, то оно не изменяется на протяжении всей работы программы. А элементы enum как раз финальные (в вашей ссылке далее по тексту приводится пример декомпиляции enum-а - это класс с public static final полями).
Почему нестатические объекты сравнивать через == нельзя, а статические можно?
Неизменяемость указателей статических полей и позволяет их сравнивать.
Примерным аналогом enum может служить следующий класс ("примерным", т.к. для полноты соответствия нужно также реализовать методы valueOf, values):
public class Season {
public static final Season WINTER = new Season();
public static final Season SPRING = new Season();
public static final Season SUMMER = new Season();
public static final Season AUTUMN = new Season();
private Season() {}
}
Season a = Season.AUTUMN;
Season b = Season.AUTUMN;
System.out.println(a == b); //true
Комментариев нет:
Отправить комментарий