भाषा के भीतर संगति। एक ऑपरेटर के पास जो अलग तरह से कार्य करता है, वह प्रोग्रामर के लिए आश्चर्यजनक हो सकता है। जावा उपयोगकर्ताओं को ऑपरेटरों को अधिभारित करने की अनुमति नहीं देता है - इसलिए संदर्भ समानता ==
वस्तुओं के बीच का एकमात्र उचित अर्थ है ।
जावा के भीतर:
- संख्यात्मक प्रकारों के बीच,
==
संख्यात्मक समानता की तुलना करता है
- बूलियन प्रकारों के बीच,
==
बूलियन समानता की तुलना करता है
- वस्तुओं के बीच,
==
संदर्भ पहचान की तुलना करता है
.equals(Object o)
मूल्यों की तुलना करने के लिए उपयोग करें
बस। सरल नियम और आप क्या चाहते हैं की पहचान करने के लिए सरल। यह सब JLS की धारा 15.21 में शामिल है । इसमें तीन उपसमूह शामिल हैं, जिनके बारे में समझना, लागू करना और कारण जानना आसान है।
एक बार जब आप ओवरलोडिंग की अनुमति देते हैं==
, तो सटीक व्यवहार कुछ ऐसा नहीं है जिसे आप जेएलएस को देख सकते हैं और अपनी उंगली को किसी विशेष आइटम पर रख सकते हैं और कह सकते हैं कि "यह कैसे काम करता है," कोड के बारे में तर्क करना मुश्किल हो सकता है। ==
एक उपयोगकर्ता के लिए सटीक व्यवहार आश्चर्यजनक हो सकता है। हर बार जब आप इसे देखते हैं, तो आपको वापस जाकर देखना होगा कि वास्तव में इसका क्या मतलब है।
चूंकि जावा ऑपरेटरों के ओवरलोडिंग के लिए अनुमति नहीं देता है, इसलिए किसी को एक मूल्य समानता परीक्षण करने की आवश्यकता होती है जिसे आप आधार परिभाषा को ओवरराइड कर सकते हैं। इस प्रकार, यह इन डिजाइन विकल्पों द्वारा अनिवार्य था। ==
जावा में संख्यात्मक प्रकारों के लिए संख्यात्मक परीक्षण, बूलियन प्रकारों के लिए बूलियन समानता, और बाकी सब चीजों के लिए संदर्भ समानता (जो .equals(Object o)
मूल्य समानता के लिए जो कुछ भी करना चाहते हैं उसे करने के लिए ओवरराइड कर सकते हैं )।
यह "इस डिजाइन निर्णय के किसी विशेष परिणाम के लिए उपयोग मामला है" का एक मुद्दा नहीं है, बल्कि "यह इन अन्य चीजों को सुविधाजनक बनाने के लिए एक डिजाइन निर्णय है, यह इसका एक परिणाम है।"
स्ट्रिंग इंटर्निंग , इसका एक ऐसा उदाहरण है। जेएलएस 3.10.5 के अनुसार , सभी स्ट्रिंग शाब्दिक इंटर्न हैं। अन्य स्ट्रिंग्स को नजरअंदाज कर दिया जाता है यदि कोई .intern()
उन पर आक्रमण करता है। यह "foo" == "foo"
सच है, स्ट्रिंग शाब्दिकों द्वारा लिए गए स्मृति पदचिह्न को कम करने के लिए किए गए डिजाइन निर्णयों का एक परिणाम है। इसके अलावा, स्ट्रिंग इंटर्निंग एक ऐसी चीज है जो जेवीएम स्तर पर होती है, जिसमें उपयोगकर्ता के लिए थोड़ा सा जोखिम होता है, लेकिन भारी बहुमत के मामलों में, ऐसा कुछ नहीं होना चाहिए जो प्रोग्रामर को चिंतित करता हो (और प्रोग्रामर के लिए मामलों का उपयोग नहीं करता था) कुछ ऐसा है जो इस सुविधा पर विचार करते समय डिजाइनरों के लिए सूची में उच्च था)।
लोग बताते हैं कि +
और +=
स्ट्रिंग के लिए अतिभारित हैं। हालाँकि, यह न तो यहाँ है और न ही वहाँ है। यह स्थिति बनी हुई है कि यदि ==
स्ट्रिंग (और केवल स्ट्रिंग) के लिए मान समानता अर्थ है, तो संदर्भ समानता के लिए किसी को एक अलग विधि (जो केवल स्ट्रिंग में मौजूद है) की आवश्यकता होगी । इसके अलावा, यह अनावश्यक रूप से जटिल तरीके होंगे जो ऑब्जेक्ट लेते हैं और ==
एक तरह से व्यवहार करने की अपेक्षा करते हैं और एक और .equals()
व्यवहार करने की आवश्यकता होती है ताकि उपयोगकर्ताओं को स्ट्रिंग के लिए उन सभी तरीकों को विशेष स्थिति में लाया जा सके।
==
वस्तुओं पर लगातार अनुबंध यह है कि यह केवल संदर्भ समानता है और यह .equals(Object o)
उन सभी वस्तुओं के लिए मौजूद है, जिन्हें मूल्य समानता के लिए परीक्षण करना चाहिए । इसकी शिकायत करना बहुत सारी चीजों को दूर करता है।
==
वस्तु समानता है औरeq
संदर्भ समानता ( inps.oreilly.com/tmarks/9780596155957/… ) है।