Вопрос №670 от пользователя Михаил Соколовский в уроке «Модуль 5. Урок 5. Перечисления в Java.», курс «Введение в Java»

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

Почему в данном примере "х" выводится на печать два раза подряд и только потом измененное значение поля count?

public class printFigure {
  static Figure f;

  public static void main(String[] args) {
    System.out.print(f.KRESTIK.count + " " + f.Nolik.count + " ");
  }
}

enum Figure {
  KRESTIK, Nolik;
  int count = 0;

    Figure() {
    System.out.print("x ");
    count = count + 1;
  }
}
10 4

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

Дело в том что в перечислении Figure есть два инстанса: KRESTIK, Nolik. Оба они буду созданы ровно в тот момент когда будет первое обращение к перечислению Figure (не зависимо от условий обращений). А соотвественно при первом обращении Вы увидеть на экране два раза текст "х ". А так же в этот момент в ОБОИХ инстансах "count" уже будет увеличен.

2

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

Не совсем очевидный пример. То есть даже при первом обращении к полю count вначале на экран будет выведено "х х", а уже потом значение этого поля? И второе, почему, если вместо строчки System.out.print(f.KRESTIK.count + " " + f.Nolik.count + " "); написать что-то вроде System.out.print(f.KRESTIK); на экране, вместо сообщения "х х", появится "х х KRESTIK"?

1

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

При первом обращении к полю count произойдет следующее:

  1. Джава увидит что произошло обращение к перечислению которе еще не загружено в оперативную память
  2. Перечисление будет загружено в оперативную память (enum Figure)
  3. Джава начнет создавать все экземпляры данного перечисления (KRESTIK, Nolik)
  4. В момент создания каждого из экземпляров будет выведен на экран "х" а так же у каждого из экземпляров будет изменено значение поля count
  5. только теперь перечисление окончательно загруженно в оперативную память и можно закончить обращение которое и стало толчком ко всем описанным процедурам (пункт №1)

Это и объясняет почему Вы видите "х х KRESTIK" при выполнении кода:

System.out.print(f.KRESTIK);

1

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

enum отличается от обычных классов не только тем, что невозможно создать новые инстансы enum, но и тем, что Java в энамы добавляет всякие вкусности. В частности будет создан кастомный toString, который будет возвращать имя данного инстанса.

0

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

Если я правильно понял, f.KRESTIK, помимо выполнения шагов 1-5, должен вернуть имя данного инстанса?

0
1

Дмитрий Аношин

Т.е. верно ли будет сказать, что при static Figure f; создается ссылка на область памяти, где ничего нет, пусто. А при вызове f.KRESTIK.count в момент "f." в зарезервированное место в озу уже запишутся все указанные экземпляры инстансов?

0

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

почти так, Java создаст в ОЗУ все инстансы enum в момент когда она будет подгружать сам enum в память из класс-файла. Иными словам первой встречи Figure в любом виде, в ОЗУ будут созданы все экземпляры enum и останутся там до конца работы программы (даже если к ним ни разу не обратились)

2

Ruslan Zinovyev

Без этих комментариев я бы не разобрался в чем дело =)

4

Николай Родионов

зашел сюда именно за этим же комментом), тонкая штука про работу java с оперативкой, много где встречал описание работы enum, но этой фишки про одновременное создание всех экземпляров не видел. Спасибо. А вообще грустно получается: жрать оперативку на несчислемое множество объектов, даже если ты ими в данный момент и не пользуешься. Выходит необходимо очень быстро подчищать эти enum(ы), если ты их бросил попользовав, или нехай висят и ресурсов не жалко?

0

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

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

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

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

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
1 июня 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
1 июня 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
1 июня 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
1 июня 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
1 июня 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
1 июня 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
1 июня 5 месяцев