Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Почему статическая доступность позволяет выполнять сравнение с помощью оператора сравнения ссылок ==?

В одной статье наткнулась на следующие строки:
Элементы 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

Комментариев нет:

Отправить комментарий