संग्रह पर स्ट्रिंग करने के लिए एक अनंत लूप में प्रवेश किया जा सकता है यदि एकत्रित वस्तुओं के ग्राफ में कहीं भी एक संदर्भ है। नीचे उदाहरण देखें।toString() में एक अनंत रिकर्सन को रोकने के लिए सबसे प्रभावी तरीका?
हां, अच्छे कोडिंग प्रथाओं को इसे पहले स्थान पर रोकना चाहिए, लेकिन फिर भी, मेरा प्रश्न है: इस स्थिति में एक पुनरावर्तन का पता लगाने का सबसे प्रभावी तरीका क्या है?
एक दृष्टिकोण थ्रेडलोकल में एक सेट का उपयोग करना है, लेकिन यह थोड़ा भारी लगता है।
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 !
}
}
[Lombok] (http://projectlombok.org/) पर एक नज़र डालें। यह आपको अपने वर्गों को '@ToString (बहिष्कृत करें = {" फ़ील्ड "," आप "," न करें "," चाहते हैं "} के साथ एनोटेट करने की अनुमति देता है। :) – elias
इस में कभी भी भाग न लें लेकिन इस तरह की चीजें असली दर्द हो सकती हैं, क्योंकि यह तब हो सकता है जब आप अपना लॉग 4j (या समान) डिबगिंग चालू करते हैं। तो आप किसी समस्या को डीबग करने का प्रयास कर रहे हैं और लॉगजर संदेशों के साथ किसी समस्या में भाग लेना चाहते हैं - बहुत परेशान! मेरे प्रश्न के लिए +1 – davidfrancis
@ डेविड फ्रांसीसी - लॉगिंग और डिबगिंग बिल्कुल ठीक है जहां यह आया! चीयर्स। – marathon