Всем привет! В данной задаче (листинг ниже, код задачи немного изменен), в режиме дебага происходит что-то странное. Если при обычном запуске программы INDEX инкрементируется нормально, то в дебаге инкремен происходит на каждой строке кода, на которой стоит брейкпоинт (на которой есть создание или обращение к объекту), а если еще непосредственный вызов toString, то два раза! То есть при дебаге вызывается метод toString() при создании объекта один раз, при инициализации int i - один раз, а на каждой строке sout - по два раза. Почему так?
public class Solution {

    public static void main(String[] args) {
        Hobby hobby = new Hobby(); // toString called - 1 time
        int i = hobby.INDEX; // toString called - 1 time
        System.out.println(Dream.HOBBY.toString()); // toString called - 2 times
        System.out.println(new Hobby().toString()); // toString called - 2 times

    }

    interface Desire {
    }

    interface Dream {
        Hobby HOBBY = new Hobby();
    }

    static class Hobby implements Dream, Desire {
        Logger log = Logger.getLogger(Hobby.class.getName());
        static int INDEX = 1;


        @Override
        public String toString() {
            INDEX++;
            log.info("tostring was called " + INDEX);
            return "" + INDEX;
        }
    }
}