तुम्ही दोघांनी ते पाहिले आहे getClass (), the Javaof ऑपरेटरचे उदाहरण खाली वापरले जाऊ शकते समान आहे () आपण समानतेसाठी तपासत असलेल्या ऑब्जेक्टच्या प्रकाराची पुष्टी करणारी एक पद्धत. तुम्हाला ते वापरण्यातील फरक माहित आहे का? getClass () वि. उदाहरण: जावा मध्ये ऑपरेटर? एकमेकांना समान () पद्धत लागू केल्याने काय परिणाम होईल? हा जावा मुलाखतीतील सर्वात आव्हानात्मक प्रश्नांपैकी एक आहे जो तुमच्यापैकी काहींना पडला असेल. त्यांच्यामध्ये खूप सूक्ष्म फरक आहे getClass () an ऑपरेटरचे उदाहरण जे संभाव्य समस्या निर्माण करू शकते समान आहे () पद्धत:

त्यांच्यातील मुख्य फरक हा आहे getClass () ऑब्जेक्ट प्रत्यक्षात निर्दिष्ट वर्गाचे उदाहरण असेल तरच खरे परत करते, परंतु ए उदाहरण: ऑपरेटर परत येऊ शकते ते बरोबर आहे जरी ऑब्जेक्ट जावामध्ये निर्दिष्ट वर्ग किंवा इंटरफेसचा उपवर्ग असेल.

हे सममितीच्या समान () पद्धतीचे उल्लंघन करू शकते, परंतु वास्तविक वर्गाऐवजी प्रॉक्सी वापरून, हायबरनेटप्रमाणे लवचिकता आणि कामगिरीसाठी वापरली जाऊ शकते. हा फरक अधिक चांगल्या प्रकारे समजून घेण्यासाठी काही कोड उदाहरणे पाहू.

JavaF मध्ये instof և getClass () मधील फरक

समतुल्य () पद्धतीकडे जाण्यापूर्वी they ते सममिती नियम कसे मोडतात, चला JavaC मधील getClass () և operatorof चे वर्तन तपासा. खालील कोडचा विचार करा, तुम्हाला काय वाटते की ते परत येईल, खरे की खोटे?

boolean result = (loader.getClass() == Thread.class); 

result = (loader.getClass() == Runnable.class); 


result = loader instanceof Thread; 


result = loader instanceof Runnable; 

तर आपण पाहू शकता की getClass () प्रतिबंधित करते की ऑब्जेक्ट्स फक्त एकाच वर्गाच्या, त्याच प्रकारच्या ऑपरेशनच्या इतर ऑब्जेक्ट्सच्या बरोबरीच्या असतात, परंतु ऑपरेटरचे उदाहरण सबक्लासच्या बाबतीतही खरे ठरते.

जर तुम्ही समान () पद्धत वापरून getClass () वापरत असाल, तर इतर ऑब्जेक्ट देखील त्याच वर्ग किंवा स्टार्टअप प्रकारातील असेल तरच ते खरे परत येईल, जरी त्याची उपवर्ग ऑब्जेक्ट L लिस्कोव्ह प्रतिस्थापन तत्त्वाचे पालन करते तरीही ती खोटी परत येईल.: .

या मर्यादेमुळे, बरेच जावा प्रोग्रामर, ज्यात मोठ्या लोकांचा समावेश आहे ओश ओशूआ ब्लॉचने इन्स्टॉफ ऑपरेटरला समान () पद्धती वापरण्याची शिफारस केली.

हे: ऑपरेटरचे उदाहरण सुपरक्लास “सबक्लास” दरम्यान समानता प्राप्त करण्यास अनुमती देते. सेट्स फ्रेमवर्कच्या दृष्टिकोनातून हे खूप महत्वाचे आहे, जे मूल्ये शोधण्यासाठी equals () पद्धत वापरते. आपण एखाद्या ऑपरेटरमध्ये उदाहरण वापरल्यास समान आहे () पद्धत, आपण उपवर्ग ऑब्जेक्टसह की समान सामग्री असल्यास देखील मूल्य मिळवू शकता, परंतु जेव्हा आपण वापरता तेव्हा हे शक्य नसते getClass () पद्धत:

हायबरनेट त्याच्या कामगिरीसाठी या ऑपरेटरच्या वर्तनावर अवलंबून आहे. जर तुम्हाला आठवत असेल तर, हायबरनेटमध्ये अस्तित्वात असलेल्या कोणत्याही अस्तित्व किंवा पर्सिस्टन्स वर्गाला मर्यादा आहे की ती अंतिम असू शकत नाही.

हे कारण आहे हायबरनेट तुमचा एंटिटी क्लास वाढवून आंतरिकरित्या प्रॉक्सी क्लासेस तयार करतो – जोपर्यंत तुम्हाला डेटाबेस फीचरची खरोखर गरज नाही तोपर्यंत ते वापरा. कारण ऑब्जेक्टचा प्रकार तपासण्यासाठी instencof वापरला जातो, प्रॉक्सी मूळ ऑब्जेक्टच्या बरोबरीची असू शकते.

दुसरीकडे, ऑपरेटरच्या वापरामध्ये, उदाहरणार्थ, देखील एक कमतरता आहे. हे सममिती कराराच्या समान () पद्धतीचा आदर करत नाही. सममिती गुणधर्म म्हणते की जर: x (y) च्या बरोबरीचे आहे तेव्हा खरे आहे y. (x) च्या समान सत्य देखील असणे आवश्यक आहे, परंतु जर आपण x ला उपवर्गाने पुनर्स्थित केले, तर उदाहरण x सत्य असेल, परंतु उदाहरण x असत्य असेल, म्हणून equals () पद्धत खोटी परत करेल.

ही वस्तुस्थिती आहे जी वापरताना किंवा वापरताना आपण विचारात घेणे आवश्यक आहे getClass () किंवा जावाओफ मधील प्रभावी () ऑपरेटरचे उदाहरण.

एवढेच आहे जावा मध्ये getClass () և instof मधील फरक. फक्त लक्षात ठेवा की getClass () ची रिटर्न खोटी आहे जर तुम्ही त्याची तुलना उपवर्ग उदाहरणाशी केली, परंतु प्रत्यक्ष ऑपरेटर उदाहरणामध्ये जर ऑब्जेक्ट वर्गाच्या उजवीकडे ऑपरेटरचा उपवर्ग असेल.

GetClass () equals () पद्धत वापरण्याचा सर्वात मोठा तोटा म्हणजे तुम्हाला दोन वस्तू मिळतात ज्या समान वाटतात (कारण ते सर्व क्षेत्रात समान आहेत), परंतु ते समान नाहीत कारण ते वेगवेगळ्या वर्गातील आहेत.

यामुळे आश्चर्यकारक वर्तन होऊ शकते, म्हणून osh oshua Bloch և इतर Javaof मध्ये equof () पद्धत वापरण्याची शिफारस करतात.

इतर: जावा लेख և मुलाखत प्रश्न जावा 67 कडून: