2013-08-20 5 views
5

प्रलेखन के रूप में विधि का वर्णन करता है:कक्षा.getDeclaredFields() लगातार सदस्यों में वापसी सदस्यों है?

सरणी लौटे पृथक नहीं किया जा में तत्वों और फिर भी मुझे यकीन है कि नहीं कर रहा हूँ किसी विशेष क्रम

में नहीं हैं, तो यह संकेत मिलता है कि आदेश नहीं होगा जब भी एप्लिकेशन नियमित रूप से आमंत्रित करता है तो हर बार सुसंगत रहें।

मैं पाया गया प्रत्येक फ़ील्ड के लिए एक अद्वितीय आईडी को जोड़ने का एक तरीका ढूंढ रहा हूं - लेकिन अगली बार एप्लिकेशन चलाने के साथ ही यह भी अनुरूप होना चाहिए, यानी मैं लगातार एक ही आईडी उत्पन्न करता हूं।

मैं बस हर फील्ड पाया अधिक पुनरावृति और प्रत्येक तत्व दोहराया प्रति एक काउंटर बढ़ाने के लिए इच्छुक हूँ। फिर काउंटर के बराबर होने के लिए विशेष तत्व की आईडी असाइन करें, ये 'आईडी' संगत नहीं हैं, हालांकि फ़ील्ड लगातार क्रम में वापस नहीं आती हैं।

उत्तर

4

आदेश रन के पार स्थिर होने की आवश्यकता नहीं है। हालांकि, क्षेत्र के hashCode() मूल्य स्थिर है (यह हमेशा field.getDeclaringClass().getName().hashCode()^field.getName().hashCode() होने के लिए दस्तावेज़ीकरण किया गया है), तो आप का उपयोग करने के लिए, अपने आईडी के रूप में है कि समझ के साथ कि हैश कोड अद्वितीय होने की गारंटी नहीं है साथ में सक्षम हो सकता परिभाषित किया गया है।

वैकल्पिक रूप से, आप getDeclaredFields() से अपने आप को लौट आए परिणाम, का उपयोग कर जो भी छँटाई मापदंड आप सूट सॉर्ट कर सकते हैं।

+0

प्रत्यक्ष उत्तर के लिए धन्यवाद। मैं सोच रहा हूं कि मैं फ़ील्ड को पेड़-मानचित्र में नाम से क्रमबद्ध करने जा रहा हूं, और उसके बाद आईडी को प्राप्त करने के लिए ऊपर उल्लिखित वही एल्गोरिदम लागू करता हूं (प्रत्येक पुनरावृत्ति प्रति वृद्धि) – Jeremy

+0

@ जेरेमी 'TreeMap' का उपयोग न करें। बस 'Arrays.sort' का उपयोग करें। –

3

हालांकि मुझे यकीन नहीं है कि इसका मतलब यह है कि जब भी एप्लिकेशन नियमित रूप से आमंत्रित होता है तो ऑर्डर सुसंगत नहीं होगा।

यह गारंटी नहीं देता है कि यह समय के साथ संगत रहेगा। लेकिन यह समय के साथ संगत हो सकता है।

और व्यवहार भिन्न JVM संस्करणों या विक्रेताओं के लिए अलग हो सकता है। और यह अप्रत्याशित चीजों से प्रभावित हो सकता है ... जैसे वर्ग अनलोड/पुनः लोड, या जेआईटी पुनर्मूल्यांकन।

संक्षेप में, यदि आपकी योजना काम करने के लिए दिखाई देती है, तो यह नाजुक होने के लिए उत्तरदायी है। अनियंत्रित व्यवहार पर भरोसा करना मूर्ख नहीं है।


यह "समय के साथ" आपके द्वारा क्या मतलब है इस पर निर्भर करता है। यदि आपके आवेदन के एक ही भाग में "समय के साथ" का मतलब है, तो यह (आईएमओ) अधिक संभावना है कि यदि आप आवेदन के विभिन्न रनों पर विचार करते हैं तो आदेश सुसंगत रहेगा।

अंत में, hashcode() का उपयोग कर आप एक आदेश देने के लिए सावधान रहना। हैशकोड टकरा सकते हैं, और यदि आपको टक्कर मिलती है तो आपका ऑर्डरिंग संदिग्ध होगा। टकराव की संभावना कम है लेकिन शून्य नहीं है, और यदि आपका उपयोग-मामला सुरक्षा से संबंधित है तो एल्गोरिदम के ज्ञान वाले किसी व्यक्ति के लिए टकराव का निर्माण करना मुश्किल नहीं होगा।

संबंधित मुद्दे