Để chuỗi trên bộ sưu tập có thể đi vào vòng lặp vô hạn nếu một nơi nào đó trong biểu đồ các mục được thu thập là tham chiếu về chính nó. Xem ví dụ bên dưới.Cách hiệu quả nhất để ngăn chặn đệ quy vô hạn trong toString()?
Có, thực hành mã hóa tốt nên ngăn chặn điều này ngay từ đầu, nhưng dù sao, câu hỏi của tôi là: Cách hiệu quả nhất để phát hiện đệ quy trong tình huống này là gì?
Một cách tiếp cận là sử dụng một bộ trong tiêu đề, nhưng điều đó có vẻ hơi nặng.
public class AntiRecusionList<E> extends ArrayList<E> {
@Override
public String toString() {
if ( /* ???? test if "this" has been seen before */) {
return "{skipping recursion}";
} else {
return super.toString();
}
}
}
public class AntiRecusionListTest {
@Test
public void testToString() throws Exception {
AntiRecusionList<AntiRecusionList> list1 = new AntiRecusionList<>();
AntiRecusionList<AntiRecusionList> list2 = new AntiRecusionList<>();
list2.add(list1);
list1.add(list2);
list1.toString(); //BOOM !
}
}
Hãy xem [Lombok] (http://projectlombok.org/). Nó cho phép bạn chú thích các lớp của bạn với '@ToString (exclude = {" fields "," you "," dont "," want "})'. :) – elias
Không bao giờ chạy vào này bản thân mình, nhưng những thứ như thế này có thể là một nỗi đau REAL, bởi vì nó chỉ có thể xảy ra khi bạn chuyển log4j (hoặc tương tự) của bạn gỡ lỗi trên. Vì vậy, bạn đang cố gắng để gỡ lỗi một vấn đề và kết thúc chạy vào một vấn đề với các thông điệp logger mình - rất khó chịu! 1 cho câu hỏi từ tôi – davidfrancis
@davidfrancis - ghi nhật ký và gỡ lỗi chính xác là nơi điều này xuất hiện! Chúc mừng. – marathon