В моей программе есть два класса, один называется GlassPiece, а другой называется TrackerChip.
Эти два объекта всегда «прочно связаны», то есть ни один GlassPieces не может совместно использовать TrackerChip, и никакие два TrackerChips не могут совместно использовать GlassPiece. Поэтому в моих методах сеттера мне нужно позаботиться о том, чтобы отключить любые старые ссылки, висящие вокруг, как показано ниже:
public class TrackerChip
{
GlassPiece linkedGlassPiece;
public void setGlassPiece(GlassPiece newGlassPiece)
{
GlassPiece oldGlassPiece = linkedGlassPiece;
linkedGlassPiece = newGlassPiece;
if(oldGlassPiece != null)
{
oldGlassPiece.setTrackerChip(null); //disconnect old GlassPiece
}
if(linkedGlassPiece != null && linkedGlassPiece.getTrackerChip() != this)
{
linkedGlassPiece.setTrackerChip(this); //update counterpart
}
}
}
и метод GlassPiece.setTrackerChip (TrackerChip) работает точно так же.
Дело в том, что вышеприведенный код на самом деле не работает, и странные вещи случаются при попытке управлять связью между несколькими разными GlassPieces и TrackerChips. Однако, если я заменю последнюю часть на:
if(newGlassPiece != null && newGlassPiece.getTrackerChip() != this)
{
newGlassPiece.setTrackerChip(this);
}
Тогда все работает правильно. Это кажется мне очень странным (все, что я сделал, это замениллингенсвязанную переменную instanceGlassPiece на параметр newGlassPiece). Но в начале метода я установил ссылки равными друг другу! Почему первый метод не работает?
P.S. Я могу подтвердить, что в методе нет бесконечного цикла.