Tôi có các lớp học sau đây.Phụ thuộc thông tư trong các lớp học java
public class B
{
public A a;
public B()
{
a= new A();
System.out.println("Creating B");
}
}
và
public class A
{
public B b;
public A()
{
b = new B();
System.out.println("Creating A");
}
public static void main(String[] args)
{
A a = new A();
}
}
Như có thể thấy rõ ràng, có một phụ thuộc vòng tròn giữa các lớp. nếu tôi cố gắng chạy lớp A, cuối cùng tôi sẽ nhận được StackOverflowError
.
Nếu biểu đồ phụ thuộc được tạo, trong đó các nút là các lớp, thì phụ thuộc này có thể dễ dàng xác định (ít nhất là đối với biểu đồ có vài nút). Vậy tại sao JVM không xác định được điều này, ít nhất là khi chạy? Thay vì ném StackOverflowError
, JVM ít nhất có thể đưa ra cảnh báo trước khi bắt đầu thực hiện.
[Cập nhật] Một số ngôn ngữ không thể có phụ thuộc vòng tròn, vì sau đó mã nguồn sẽ không được tạo. Ví dụ: see this question và câu trả lời được chấp nhận. Nếu phụ thuộc vòng tròn là một mùi thiết kế cho C# thì tại sao nó không dành cho Java? Chỉ vì Java có thể (biên dịch mã với phụ thuộc vòng tròn)?
[update2] Đã tìm thấy jCarder. Theo trang web, nó tìm thấy deadlocks tiềm năng bằng cách tự động thiết lập mã byte Java và tìm kiếm các chu kỳ trong đồ thị đối tượng. Bất cứ ai có thể giải thích làm thế nào công cụ tìm thấy các chu kỳ?
Tại sao bạn mong đợi để có được một cảnh báo về vấn đề này? Bạn đã đọc một nơi nào đó mà JVM sẽ làm điều này cho bạn? – Cratylus
Các loại vấn đề là rất dễ dàng cho các nhà phát triển để phát hiện và đầu tiên. JVM có xu hướng cảnh báo một vấn đề bout bạn không thể phát hiện dễ dàng, giống như một tệp lớp tham nhũng. –
Tôi thích cách chỉ 2 trong số 5 câu trả lời (tính đến thời điểm tôi viết bài này) thực sự trả lời câu hỏi của bạn: 'tại sao trình biên dịch không phát hiện và cảnh báo về vấn đề tiềm năng'. Và cả 2 đều không được bình chọn nhiều nhất (một lần nữa, ít nhất là vào thời điểm tôi viết bài này). –