Tôi muốn tránh sự phụ thuộc vòng tròn này, có một vài lý do để làm điều đó.
Nhận xét về this article
Một constructor lộn xộn là một dấu hiệu. Nó cảnh báo tôi rằng lớp học của tôi đang trở thành một khối nguyên khối, đó là một jack của tất cả các ngành nghề và một bậc thầy của không. Nói cách khác, một nhà xây dựng lộn xộn thực sự là một điều tốt. Nếu tôi cảm thấy rằng các nhà xây dựng của một lớp học là quá lộn xộn, tôi biết rằng đó là thời gian để làm một cái gì đó về nó.
Và this one
Bạn sẽ tìm thấy trường hợp một lớp A cần một thể hiện của B và B cần một thể hiện của A. Đây là một trường hợp điển hình của một phụ thuộc vòng tròn và rõ ràng là xấu. Theo kinh nghiệm của tôi, giải pháp là làm cho B trở thành một phần của A khi hai người phụ thuộc quá mạnh đến nỗi họ thực sự nên là một lớp. thường xuyên hơn dù có thêm ít nhất một C ẩn lớp trong đó để B không cần A nhưng chỉ C.
Như Oliver Gerke commented:
Đặc biệt constructor injection thực sự ngăn cản bạn giới thiệu các phụ thuộc cyclic. Nếu bạn giới thiệu chúng, bạn về cơ bản làm cho hai bên một bởi vì bạn không thể thực sự thay đổi một mà không có nguy cơ để phá vỡ khác, mà trong mọi trường hợp là một mùi thiết kế.
Đây là một ví dụ nhỏ về những gì tôi có thể làm.
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();
}
}
Sau khi tái cấu trúc, nó có thể trông như thế này.
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
}
}
Nguồn
2015-04-27 14:37:57
Bạn cần phải cấu trúc lại, di chuyển mã phụ thuộc khỏi các lớp A và B này và tạo lớp C. –
@ André. Cảm ơn vi đa trả lơi. Bạn có thể nói cách A và B này gọi từ C – Patan
CDI không thể xử lý phụ thuộc vòng tròn, EJB có thể – maress