Будут ли какие-либо проблемы с этой настройкой, которые могут привести к бесконечному циклическому созданию экземпляров?
Типами ссылок по умолчанию являются null
.Если вы не создадите экземпляр нового экземпляра и не назначите его этой переменной, то для этого типа код не вызывается.
Каждый из конструкторов создает экземпляр другого объекта?Возможно ли, что они могли бы в будущем (возможно, случайно)?Если да, то да, вы можете воспользоваться сценарием, о котором вы говорите:
class A
{
public A()
{
this.B = new B();
}
public B B;
}
class B
{
public A A = new A(); // This is the same as instantiating the object in the ctor
}
// ...
A obj = new A(); // This calls new B, which calls new A, repeat ad infinitum
Вы можете разорвать такой цикл, создав экземпляр другого объекта за пределами конструктора.Например, при первом доступе:
class A
{
public A()
{
}
public B B
{
get
{
if(b == null)
b = new B();
return b;
}
}
private B b;
}
class B
{
public B()
{
}
public A A
{
get
{
if(a == null)
a = new A();
return a;
}
}
private A a;
}
// ...
A obj = new A(); // new B doesn't get called yet
obj.B.Something(); // ... Now it does...
Вам все равно нужно быть осторожным, чтобы class A
не обращался к своему собственному свойству this.B
внутри своего конструктора, и наоборот.Вы можете получить доступ к этим свойствам в любых методах, если хотите, если эти методы не вызываются внутри конструктора.
Другой вариант заключается в внедрении зависимостей.Здесь вы передаете зависимость объекту, а не позволяете ему создать экземпляр самого объекта:
class A
{
public A(B b)
{
this.B = b;
}
public B B;
}
class B
{
public B(A a)
{
this.A = a;
}
public A A;
}
// ...
A someA = new A(
new B(
null)); // You have to break the cycle somewhere...
someA.B.A = someA;
// or ...
class ABFactory
{
public static A CreateA(/* options for a */, /* options for b */)
{
A result = new A(
new B(
null));
result.B.A = result;
return result;
}
}
Обратите внимание, что внедрение зависимости не было изобретено для решения этой проблемы, но оно будет работать в этом сценарии.С ним вы можете быть спокойны, зная, что никогда больше не решите эту проблему.