2014-10-19 19 views
18

चूंकि संस्करण 8 जावा में value-based classes की अवधारणा है। यह भविष्य के संस्करण की तैयारी में है जो अधिकतर value types की परिभाषा की अनुमति देगा।जावा के मूल्य-आधारित वर्गों को क्रमबद्ध क्यों नहीं किया जाना चाहिए?

मौजूदा मूल्य आधारित कक्षाओं के बारे में:: दोनों परिभाषाओं/विवरण क्रमबद्धता (बोल्ड चेहरा मेरे द्वारा जोड़ा) का उल्लेख

एक कार्यक्रम अप्रत्याशित परिणाम का उत्पादन हो सकता है अगर यह एक के बराबर मूल्यों के लिए दो संदर्भों भेद करने के लिए प्रयास करता है मान-आधारित वर्ग, सिंक्रनाइज़ेशन, पहचान हैशिंग, क्रमबद्धता, या किसी अन्य पहचान-संवेदनशील तंत्र के लिए अपील के माध्यम से सीधे संदर्भ समानता या परोक्ष रूप से।

भविष्य मूल्य प्रकार के बारे में: वस्तु के लिए

डिफ़ॉल्ट पहचान-आधारित हैश कोड, System.identityHashCode के माध्यम से उपलब्ध है, यह भी मूल्य प्रकार के लिए लागू नहीं होता। क्रमिकरण जैसे आंतरिक संचालन जो वस्तुओं के पहचान-आधारित भेद को मूल्यों पर लागू नहीं करते हैं (क्योंकि वे प्राइमेटिव्स पर लागू नहीं होते हैं) या अन्यथा वे मूल्य प्रकार की हैशकोड विधि द्वारा प्रदत्त मान-आधारित भेद का उपयोग करेंगे।

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

लेकिन मुझे नहीं पता कि इस में क्रमबद्धता कैसे चलती है। इसे "पहचान-संवेदनशील तंत्र" क्यों माना जाता है? यह क्यों है "वस्तुओं की पहचान-आधारित भेद"?

+0

विषय में वास्तविक प्रश्न और प्रश्न पूरी तरह से अलग हैं। – Chris311

उत्तर

12

सीरियलाइजेशन System.identityHashCode (IdentityHashMap के माध्यम से) का उपयोग यह सुनिश्चित करने के लिए करता है कि deserialization के परिणामस्वरूप ऑब्जेक्ट ग्राफ़ का टोपोलॉजी स्थलीय रूप से इनपुट ग्राफ़ के बराबर है।

+1

यह मेरा मुद्दा है - पहचान मुख्य रूप से टोपोलॉजी को संरक्षित करने के लिए ग्राफ एल्गोरिदम के लिए प्रासंगिक है; यानी, चक्रों पर लूपिंग से बचें। –

+6

यह उत्तर केवल यह बताता है कि क्यों deserialization प्रक्रिया में पहचान भूमिका निभा सकता है। हालांकि, मैं नहीं देख सकता कि इसका मतलब क्यों है कि "मूल्य-आधारित वर्गों को क्रमबद्ध नहीं किया जाना चाहिए," जो मूल प्रश्न प्रतीत होता है। (भले ही ओपी उत्तर से संतुष्ट हो।) –

+10

इसका विकल्प क्या होगा? मैं उस ऑब्जेक्ट को क्रमबद्ध कैसे करूं जिसमें स्थानीयडेट फ़ील्ड – jtkSource

3

सोचें कि जब ऑब्जेक्ट ग्राफ़ को क्रमबद्ध किया जाता है तो चक्र होता है। Serialization एल्गोरिदम इस तरह के मामले — में एक अंतहीन पाश में प्रवेश करेगा जब तक कि उसके पास चक्रों का पता लगाने और हल करने के लिए एक विशिष्ट तंत्र नहीं है। हम सभी जानते हैं कि जावा का क्रमिकरण चक्रीय वस्तु ग्राफ को अनुमति देता है, इसलिए तंत्र वहां है।

अब चक्र के परिभाषा पर विचार करें: ग्राफ़ में एक ऑब्जेक्ट होता है जो स्वयं से पहुंच योग्य होता है। यह परिभाषा ऑब्जेक्ट की पहचान को संदर्भित करती है, जिसका अर्थ है कि तंत्र को चक्रों को ट्रैक करने के लिए ऑब्जेक्ट पहचान पर विचार करना चाहिए। कार्यान्वयन स्तर पर यह सभी देखा उदाहरणों के IdentityHashMap को बनाए रखकर हासिल किया जाता है, और वह वर्ग Object.identityHashCode() पर निर्भर करती है।

वाक्य आप बोली बताते हैं कि कैसे इस समस्या को जावा के भविष्य के संस्करण में सुलझा लिया जाएगा: मूल्य प्रकार विशेष उपचार ऐसी है कि चक्र का पता लगाने == और identityHashCode के बजाय अपने स्वयं के equals और hashCode तरीकों पर निर्भर करेगा दिया जाएगा।

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

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