Названия, которые вы использовали, сбивают с толку. sameAs
звучит так, как будто это тест, который должен возвращать логическое значение, но из вашего кода кажется, что он будет более подходящим именем declareSameAs
. Когда вы звоните foo.sameAs(bar)
, вы заявляете, что foo
и bar
одинаковы, не проводите тест, верно?
Проблема в том, что с вашим кодом вы можете объявить
x.sameAs(y);
y.sameAs(z);
но это не тот случай, когда x совпадает с z, что, вероятно, не то, что вы хотите (и если это то, что вы хотите, вам определенно нужно изменить имя метода).
Мне кажется, вы хотите разделить свои экземпляры на наборы, и каждый экземпляр должен хранить ссылку на набор, в котором он находится ( не на отдельный набор, внутренний для экземпляра). Когда вы делаете новое объявление, что два экземпляра одинаковы, вам нужно объединить наборы и убедиться, что все затронутые экземпляры имеют ссылку на объединенный набор.