2015-09-03 8 views
7

प्रैक्टिस में, टूस्ट्रिंग विधि को ऑब्जेक्ट का स्ट्रिंग प्रस्तुति वापस करनी चाहिए।जब हम toString() विधि को ओवरराइड करते हैं तो हमें हमेशा ऑब्जेक्ट का स्ट्रिंग प्रस्तुति वापस करनी चाहिए?

एक प्रोजेक्ट में, मुझे कुछ कक्षाएं मिलीं जो टर्निंग विधि को ओवरराइड करती हैं जो रिटर्न नल की अनुमति देती है।

तरह:

@Override 
public String toString() { 
    ....... 
    return null; 
} 

मेरे लिए, यह अभ्यास प्राचार्य से उल्लंघन toString विधि उस वस्तु की एक स्ट्रिंग प्रतिनिधित्व लौटना चाहिए का प्रस्ताव है।

Object.toString के लिए API दस्तावेज़() का कहना है:

सार्वजनिक स्ट्रिंग toString()

रिटर्न वस्तु के एक स्ट्रिंग प्रतिनिधित्व। आम तौर पर, टूस्ट्रिंग विधि एक स्ट्रिंग देता है जो इस ऑब्जेक्ट को "पाठ रूप से दर्शाती है"। नतीजा एक संक्षिप्त लेकिन सूचनात्मक प्रतिनिधित्व होना चाहिए जो किसी व्यक्ति को पढ़ने के लिए आसान है। यह अनुशंसा की जाती है कि सभी सबक्लास इस विधि को ओवरराइड करें।

जब हम ऑब्जेक्ट की ToString() विधि को ओवरराइड करते हैं, तो आपको कभी वापस शून्य नहीं करना चाहिए?

+6

मैं स्वीकार करूंगा कि मैं उत्सुक हूं, '.......' के पीछे क्या छिपा रहा है? –

+0

वास्तव में, मुझे नहीं पता, मैं देखता हूं कि एक तुलनात्मक वस्तु में जो o1.toString() == शून्य से पूछता है, जब मैं देखता हूं कि मैं खुद से कहता हूं कि यह सामान्य नहीं है, यह एक अच्छा अभ्यास नहीं है। –

उत्तर

9

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

हालांकि यह, बराबरी और hashCode अनुबंध (आइटम 8, आइटम 9) का पालन करने के लिए एक अच्छा toString कार्यान्वयन प्रदान करने के रूप के रूप में महत्वपूर्ण नहीं है अपने वर्ग भी बहुत कुछ करने के लिए सुखद बनाता है: प्रभावी जावा, अध्याय 3, मद 10 से उपयोग। जब किसी ऑब्जेक्ट को println, printf, स्ट्रिंग कॉन्सटेनेशन ऑपरेटर, या assert, या डीबगर द्वारा मुद्रित किया जाता है, तो ToString विधि स्वचालित रूप से लागू होती है।

वस्तु # toString के लिए API दस्तावेज़ों में सलाह है:

सामान्य तौर पर, toString विधि एक स्ट्रिंग है कि इस वस्तु "टेक्स्ट रूप का प्रतिनिधित्व करता है" देता है। नतीजा एक संक्षिप्त लेकिन सूचनात्मक प्रतिनिधित्व होना चाहिए जो किसी व्यक्ति को पढ़ने के लिए आसान हो। यह अनुशंसा की जाती है कि सभी उप-वर्ग इस विधि को ओवरराइड करें।

रिटर्निंग नल कभी भी जानकारीपूर्ण के रूप में नहीं गिना जाएगा, और आसानी से भ्रामक हो सकता है। ऐसा लगता है कि कोई ऐसा करने के लिए स्ट्रिंग का उपयोग कर रहा था जिसका कभी इरादा नहीं था।

+0

'toString()' का उपयोग डीबगिंग तक ही सीमित नहीं है। एक काउंटर उदाहरण के रूप में, 'Integer.toString() पर विचार करें। और क्या आप यह इंगित करना चाहते हैं कि लौटने वाले शून्य ने जेएलएस का उल्लंघन किया है? –

+0

@ एंडी: ओपी वह था जिसने कहा कि वापस लौटने से जेएलएस का उल्लंघन हो सकता है। आपके उदाहरण में स्ट्रिंग उचित फॉर्मेटर का उपयोग करने के लिए एक शॉर्टकट है। इसलिए यह उपयोगकर्ता के अनुकूल प्रस्तुति के विपरीत डीबगिंग, लॉगिंग, एक प्रतिलिपि में देखने आदि के लिए सबसे अधिक प्रतिनिधित्व के रूप में प्रतीत होता है। –

+0

एक अन्य काउंटर उदाहरण के रूप में, 'Enum.toString() 'पर विचार करें। मुद्दा यह है कि 'toString() 'अक्सर डीबगिंग के अलावा अन्य उद्देश्यों के लिए उपयोग किया जाता है। लॉग फ़ाइल या डीबगर में उपयोगिता के लिए मौजूदा कोड को आकस्मिक रूप से बदलना अन्य उपयोगों को तोड़ सकता है। –

0

toString() ऑब्जेक्ट की "मानव" प्रस्तुति है, जो नाथन जैसे डीबगिंग के लिए और अनुप्रयोगों में प्रस्तुति की "गति विधि" के रूप में उपयोग की जाती है।

कभी-कभी पीपल्स क्रमशः/deserialization के साथ स्ट्रिंग() में मिश्रण कर रहे हैं (सभी महत्वपूर्ण (गैर-क्षणिक) फ़ील्ड शामिल होना चाहिए) और मूल्यों को पढ़ने के लिए एल्गोरिदम के कारण सटीक होना चाहिए।

1

जब भी ऐसा करने के लिए आपको व्यावहारिक है तो आपको toString() विधि को ओवरराइड करना चाहिए।

शून्य लौटने के लिए, मुझे लगता है कि पूरी तरह से बेकार होने के रूप में toString() ज्यादातर डिबगिंग के दौरान उपयोग किया जाता है। तो नहीं, आपको कभी भी एक स्ट्रिंग() विधि से शून्य वापस नहीं करना चाहिए।

आप बेवकूफ को ठीक नहीं कर सकते, लेकिन आप इससे सीख सकते हैं।

-1

यह ToString() के अनुकूलित उपयोग की तरह दिखता है। यह ओवरराइड विधि पूरी तरह कार्यान्वयन पर आधारित है जो उपयोगकर्ता अपनी आवश्यकताओं के अनुसार प्राप्त करने का प्रयास करता है। मेरे द्वारा वापस लौटने के बाद कोई नुकसान नहीं होता है जब तक कि उपयोगकर्ता इस मान को वापस करने की अपेक्षा करता है, क्योंकि स्ट्रिंग डेटा प्रकार में शून्य को संग्रहीत किया जा सकता है।

लेकिन हां ओवरराइड करना ToString एक अच्छा अभ्यास नहीं है जब तक कि आपको ऐसा करने के लिए उचित औचित्य न मिले।

+3

'toString()' को ओवरराइड करने में बिल्कुल कुछ भी गलत नहीं है, और यह अक्सर उपयोगी होता है। –

5

जावा भाषा विशिष्टता toString() से शून्य को वापस करने पर रोक नहीं देती है। इसके बजाए, यह स्पष्ट रूप से स्वीकार करता है कि शून्य वापस लौटाया जा सकता है।

Section 4.3.1: Objects

स्ट्रिंग संयोजन ऑपरेटर + (§15.18.1) है, जो है, जब एक स्ट्रिंग संकार्य और एक संदर्भ को देखते हुए की toString विधि लागू द्वारा स्ट्रिंग के संदर्भ में परिवर्तित कर देंगे संदर्भित वस्तु ("अशक्त" का उपयोग कर यदि या तो संदर्भ या toString का परिणाम एक अशक्त संदर्भ है)

पाठ आप का हवाला देते Object.toString() के लिए API दस्तावेज़ों से है। आप की तरह, मैंने दृढ़ता से यह संकेत दिया कि एक गैर-शून्य मान वापस कर दिया गया है।

एक गैर-शून्य मूल्य लौटाना सबसे उपयोगी होगा। रिटर्निंग नल डीबगर्स में उलझन में हो सकता है, जिससे दुर्भाग्यवश शून्य से वापसी मूल्य के साथ एक स्ट्रिंग() में एक शून्य संदर्भ और एक पूरी तरह से अच्छा गैर-शून्य संदर्भ के बीच अंतर करना मुश्किल हो जाता है।

0

मेरे दृष्टिकोण से आपको toString() विधियों में शून्य वापस नहीं करना चाहिए।

यह जानकारीपूर्ण नहीं है और न ही उपयोग योग्य है। इसके विपरीत, toString() विधि का उपयोग करके डेटा डेटा क्लास उदाहरणों के लिए सही और सूचनात्मक तारों को वापस करने के लिए आपको और आपके साथियों को आपकी कक्षाओं का उपयोग करने और उन्हें अधिक जटिल डेटा संरचनाओं में शामिल करने में सहायता मिलेगी।

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

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