Кажется, что во время итерации цикла некоторые свойства obj изменяются для ключей, отличных от того, который установлен в данный момент. Есть ли проблема с приведенным выше кодом? Каким-то образом ссылка на obj перерабатывается циклом for?
Переменная obj
будет установлена на «следующий» элемент итератора для objects
каждый раз вокруг цикла. Если вы видите одно и то же значение ссылки в obj
более одного раза, это может быть только потому, что:
ссылочное значение действительно появляется более одного раза в коллекции, массиве или чем-либо еще, заданном objects
или
что-то в setSomeProperty
или getADiffProperty
или что-то еще, что вы делаете в цикле, обновляет objects
как побочный эффект, или
объект objects
имеет ошибочную реализацию итератора.
Другая возможность состоит в том, что вы видите разные объекты с одинаковыми значениями adiff
.
Чтобы сказать больше, мне нужно увидеть больше исходного кода, чем предоставленный вами упрощенный фрагмент.
РЕДАКТИРОВАТЬ - предоставленный вами дополнительный код не выявил проблему. (Я думаю, что мы можем отклонить любые теории, связанные с обновлением списков, пока они повторяются, или странные побочные эффекты от сеттеров.)
Я подозреваю, что один из тех списков, которые предоставляет синглтон, содержит дубликаты или что-то еще неожиданное. Это может быть то, что вызывает вашу проблему.
Делайте то, что предлагает @Carl, и используйте traceprints и / или отладчик, чтобы выяснить, что находится в синглтоне Collection и что на самом деле делает ваш код.
РЕДАКТИРОВАТЬ 2 - Тот факт, что сборщик является одноэлементным классом, вероятно, не имеет значения. И содержимое HashMap НЕ изменяется случайно или спонтанно. (И в вашем коде нет маленьких зеленых демонов, которые сговорились бы заставить его потерпеть неудачу. Поверьте мне!)
У вас, похоже, есть разум, чтобы угадать, в чем проблема, и вносить изменения на основе этих предположений в надежде, что они решат проблему. Хватит гадать! Это неправильный подход, который, вероятно, только усугубит ситуацию. Вам нужно аккуратно и методично отладить код, собрать убедительные доказательства того, что на самом деле делает ваша программа, и тщательно интерпретировать эти доказательства ... не прибегая к сумасшедшим представлениям о том, что что-то меняет случайным образом.
РЕДАКТИРОВАТЬ 3 - Если бы я был в вашей ситуации, я бы попросил другого опытного Java-программиста в команде сесть со мной и помочь мне отладить код. Мне все еще иногда приходится делать это самому, и у меня было более 10 лет опыта в Java и более 30 лет опыта программирования. Иногда у вас возникает ментальный блок по проблеме, и ответом является свежий взгляд / свежий подход.
Не стыдно признаться своей команде / боссу, что вы не в своей тарелке и нуждаетесь в помощи.