IntelliJ: пошаговая отладка нового HashSet (): поле инициализируется, не видя его - PullRequest
0 голосов
/ 31 декабря 2018

Я не знаю, вызвана ли проблема моей версией JDK, моей версией IntelliJ или отсутствием полного понимания Java.
Я проверял HashSet реализацию и хотел знать, когдаполе keySet инициализируется.Я видел метод

public Set<K> keySet() {
    Set<K> ks = keySet;
    if (ks == null) {
        ks = new KeySet();
        keySet = ks;
    }
    return ks;
}

, который, кажется, является местом, где поле устанавливается впервые, но когда я ставлю свою точку останова на условие, ks никогда не бывает нулевым!Поэтому я решил проверить, в какой момент он инициализируется, но, похоже, я его не нашел.Я просто выполнил следующую инструкцию (1) шаг за шагом, используя кнопку Force Step Into IntelliJ:

HashSet<String> set = new HashSet<>();

Я попал в инструкцию (2):

map = new HashMap<>();

И к инструкции (3)

 this.loadFactor = DEFAULT_LOAD_FACTOR;

После инструкции (3), непосредственно перед выходом из конструктора public HashMap(), если я оцениваю поле keySet, оно все еще равно нулю.
Но сразу после этого, точно после инструкции (2), перед тем, как покинуть конструктор public HashSet(), если я оцениваю map.keySet, он больше не равен нулю!

Что это за колдовство?Я что-то здесь упускаю или это проблема моего отладчика?Я использую jdk-9.0.1 и IntelliJ IDEA 2017.2.5

1 Ответ

0 голосов
/ 31 декабря 2018

При отладке отладчик попытается показать вам содержимое HashSet, поэтому он вызывает метод sets toString(), который косвенно вызывает метод keySet() объекта поддержки HashMap, тем самым инициализируяполе keySet.

Отладчик игнорирует точки останова во время вызова на toString(), поэтому вы не видите вызов.

...