Я действительно не понимаю вашу проблему. Что происходит, когда вы создаете несколько экземпляров класса A, а затем один экземпляр класса B?
A a1 = new A();
A a2 = new A();
A a3 = new A();
A a4 = new A();
A a5 = new A();
B b = new B();
Какой тест проходит? Какой из них терпит неудачу?
Видите ли, после создания экземпляра A
он имеет состояние . Это состояние должно быть как-то связано с экземпляром B
, существующим экземпляром . Таким образом, этот экземпляр B
должен существовать даже до того, как вы создадите экземпляр этого класса A
.
То же самое верно для экземпляра B
. Он должен содержать ссылку на уже существующий экземпляр A
.
Насколько я понимаю, класс A должен иметь конструктор со ссылкой на существующий экземпляр B:
public class A
{
private B b;
public A(B b)
{
this.b = b;
}
}
// Then you can have:
B b1 = new B();
A a1 = new A(b1); // here's the link
B b2 = new B();
A a2 = new A(b2); // and another link
Либо так, либо наоборот с B
.
Вы пишете, что не хотите изменять публичные подписи A
и B
, и не хотите добавлять фабрики в код. Я действительно не вижу последовательного решения при таких ограничениях. Или, может быть, сама задача недостаточно ясна?
РЕДАКТИРОВАТЬ: Делая здесь дикую догадку, я думаю, что то, чего вы пытаетесь достичь здесь, может быть сделано с помощью Reflection: вы можете отразить существующий код до некоторой точки (в стеке вызовов) и сопоставить новый экземпляр скажем, A
для существующего экземпляра B
. Это можно сделать с помощью отражения, но это довольно сложно, и вы должны иметь конкретный и надежный набор правил для связи между новыми экземплярами A
s и B
s. Если это является направлением нужного решения, то я думаю, что вам следует погрузиться в отражение и посмотреть, как оно происходит, это огромное поле.