2015-11-25 3 views
3

Я чувствую, что это действительно основной вопрос, но у меня никогда не было такой ситуации. Сейчас у меня есть структура вроде этого:Java: классы с экземпляром друг друга

public class Main{ 
    ClassA a = new ClassA(); 
    ClassB b = new ClassB(a); 
} 

My ClassA необходима в ClassB, а также в Main.class. Теперь я заметил, что ClassA должен знать ClassB.

public class Main{ 
    ClassA a = new ClassA(b); 
    ClassB b = new ClassB(a); 
} 

Очевидно, что это не сработает. Сначала я подумал о том, чтобы использовать Observer Pattern, но для меня это кажется излишним, к тому же обычно это не тот шаблон.
Есть ли способ, что я могу сделать Main.class знаю ClassA.class & ClassB.class, а также сделать ClassA.class знать ClassB.class и наоборот? Так как Main.class использует ClassA, также я должен иметь один и тот же класс, инициализированный только один раз.

+1

Его круговая зависимость, которой вы должны избегать – Rehman

+1

Почему бы не назначить ее? Сначала объявите 'b', затем присвойте' a' переменной. Вам не обязательно включать это в конструктор. – Arc676

+1

Как сказал «Рехман», это гарантированная утечка памяти, потому что два объекта всегда будут указывать друг на друга, и, если только один из них явно не установлен в «null», ни один из них не будет собран из мусора. – NRitH

ответ

7

Вам не нужно устанавливать ссылки в конструкторе. Вы можете создать сеттер, который вы можете вызвать после создания обоих объектов, таких как b.setA(a);.

+0

Я чувствую себя почти глупо, чтобы забыть этот вариант ... Спасибо –

3

вы можете использовать метод

сеттер добавить в свой ClassA:

public void setB(ClassB b) { 
    this.b = b; 
} 

, а затем:

public class Main{ 
    ClassA a = new ClassA(); 
    ClassB b = new ClassB(a); 
    a.setB(b); 
} 
0

Вам не нужны классы, чтобы узнать друг о друге, а скорее чем a экземпляр ClassA знать о b экземпляр ClassB.

В этом случае вы можете создать сеттер в ClassA и назвать его после строительства b, или вы можете использовать волшебную. Некоторые рамки DI могут реализовать указанную магию для вас. Одним из примеров такой магики является передача в обертку в конструктор ClassA и установка обертки для вывода на столбец b.

Наконец, вы можете посмотреть на свою структуру классов. В настоящее время у вас есть круговая зависимость, и они, как правило, плохие. Могут ли ClassA и ClassB быть зависимыми от нового ClassC (который не имеет зависимостей), например?

1

Невозможно создать экземпляр ClassA и ClassB и передать их друг другу в конструкторы.

Что вы могли бы сделать, это создать сеттер в ClassA, чтобы установить ClassB экземпляр, который вы называете после создания обоих объектов:

ClassA a = new ClassA(); 
ClassB b = new ClassB(a); 
b.setA(a); 

Однако тот факт, что вам нужно иметь два объекта, которые относятся к каждому другой - красный флаг в отношении дизайна классов. Это означает, что два класса очень тесно связаны, и в целом вы хотите loose coupling.

Лучше, если бы вы могли изменить дизайн своих классов, чтобы вам не нужна круговая зависимость, подобная этой. Возможно, вам стоит просто сделать их одним классом или добавить дополнительный класс, который представляет связь между объектами ClassA и ClassB - например, ClassC, в котором содержатся ссылки на объекты a и b.

Какое решение подходит, зависит от того, что вы делаете в точности; Трудно сказать, без дополнительной информации о вашей реальной ситуации.

Смежные вопросы