Трудно сказать без дополнительной информации о TaskCard
и других объектах, но вы должны попытаться объявить некоторую переменную final
и попытаться напечатать хеш-код для объекта, чтобы проверить, действительно ли он такой же экземпляр или другие экземпляры, семантически равные:
for (Iterator<TaskCard> i = taskManager.getTaskCards().iterator(); i.hasNext();) {
TaskCard taskCard = i.next();
taskCard.updateTask();
ReturnInterface<String> returnInterface = new TaskReturnIterface(taskManager, taskCard);
Task task = taskCard.getTask();
// Mark this as "final" so you can use it as is in any internal anonymous class:
final ProtocolInterface selectedProtocol = task.getDevice().getSelectedProtocol();
selectedProtocol.setTask(task);
selectedProtocol.setReturnInterface(returnInterface);
System.out.println("[1] selectedProtocol device=" + selectedProtocol.getDevice().hashCode());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("[2] selectedProtocol device=" + selectedProtocol.getDevice().hashCode());
}
});
}
Казалось бы, есть некоторые связи между объектами, которые могут либо печатать один и тот же вывод, либо использовать один и тот же объект в бэкэнде. Особенно эта часть:
ProtocolInterface selectedProtocol = task.getDevice().getSelectedProtocol();
selectedProtocol.setTask(task);
selectedProtocol.setReturnInterface(returnInterface);
выглядит странно, поскольку selectedProtocol
кажется каким-то образом привязанным к самому устройству, привязанному к задаче, тогда вам придется снова ставить его задачу?
Это в основном делает task.getDevice().getSelectedProtocol().setTask(task)
, который выглядит как лазейка, которую вы должны проверить ...
Кроме того, SwingUtilities.invokeLater()
является своего рода зарезервированным для обработки графического интерфейса, так что вы можете удалить его (если он не выполняет GUI ...).