Chciałbym uniknąć tej zależności cyklicznej, jest kilka powodów, aby to zrobić.
Skomentuj this article
niechlujny konstruktora jest znakiem. Ostrzega mnie, że moja klasa staje się monolitem, który jest dźwignikiem wszystkich zawodów i mistrzem nikogo. Innymi słowy, niechlujny konstruktor jest naprawdę dobrą rzeczą. Jeśli czuję, że konstruktor klasy jest zbyt brudny, wiem, że nadszedł czas, aby coś z tym zrobić.
I this one
Znajdziesz przypadki klasy A potrzebuje instancję B i B musi wystąpienie A. Jest to typowy przypadek uzależnienia kołowego i jest oczywiście złe. Z mojego doświadczenia wynika, że rozwiązaniem jest albo uczynienie B częścią A, gdy są tak silnie zależni, że naprawdę powinni być jedną klasą. Częściej jednak istnieje co najmniej jedna klasa C ukrywa się tam tak, że B nie potrzebuje, ale tylko C.
Jako Oliver Gerke commented:
Szczególnie wtrysk konstruktor faktycznie uniemożliwia wprowadzanie cyklicznych zależności. Jeśli je wprowadzisz, to w istocie uczynisz dwie strony jedną, ponieważ nie możesz tak naprawdę zmienić jednego bez ryzyka złamania drugiego, co w każdym przypadku jest zapachem projektowym.
Oto mały przykład tego, co mogę zrobić.
public class A {
private B b;
@Autowired
public A(B b) {
this.b = b;
}
public void doSomeWork() {
// WORK
}
public void doSomeWorkWithB() {
b.doSomeWork();
}
}
public class B {
private A a;
@Autowired
public B(A a) {
this.a = a;
}
public void doSomeWork() {
// WORK
}
public void doSomeWorkWithA() {
a.doSomeWork();
}
}
Po refaktoryzacji może wyglądać tak.
public class A {
private C c;
@Autowired
public A(C c) {
this.c = c;
}
public void doSomeWork() {
// WORK
}
public void doSomeWorkWithC() {
c.doSomeWorkThatWasOnA();
}
}
public class B {
private C c;
@Autowired
public B(C c) {
this.c = c;
}
public void doSomeWork() {
// WORK
}
public void doSomeWorkWithC() {
c.doSomeWorkThatWasOnB();
}
}
public class C {
public void doSomeWorkThatWasOnB() {
// WORK
}
public void doSomeWorkThatWasOnA() {
// WORK
}
}
Musisz zmienić kod, przenieść zależny kod z tych klas A i B i utworzyć klasę C. –
@ André. Dziękuję za odpowiedź. Czy możesz powiedzieć, jak to A i B wywołane z C – Patan
CDI nie może obsłużyć zależności okrężnej, EJB może – maress