पृष्ठभूमि
सभी जावा ऑब्जेक्ट में एक toString()
विधि होती है, जिसे जब आप कोशिश करते हैं और ऑब्जेक्ट प्रिंट करते हैं, तो इसे लागू किया जाता है।
System.out.println(myObject); // invokes myObject.toString()
इस विधि को Object
कक्षा में परिभाषित किया गया है (सभी जावा वस्तुओं का सुपरक्लास)। Object.toString()
विधि एक काफी बदसूरत देख स्ट्रिंग, वर्ग, एक का नाम से बना देता है @
प्रतीक और hashCode हेक्साडेसिमल में वस्तु की। इसके लिए कोड इस तरह दिखता है:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
इस तरह के रूप में एक परिणाम के रूप में com.foo.MyType@2f92e0f4
समझाया जा सकता है:
com.foo.MyType
- क्लास का नाम, यानी क्लास MyType
पैकेज में है com.foo
।
@
- एक साथ तार जुड़ता है
2f92e0f4
वस्तु का हैशकोड।
सरणी वर्गों का नाम थोड़ा अलग दिखता है, जिसे जावदोस्क में अच्छी तरह से समझाया गया है Class.getName()
। उदाहरण के लिए, [Ljava.lang.String
इसका मतलब है:
[
- एक एकल आयामी सरणी (के रूप में [[
या [[[
आदि के विपरीत )
L
- सरणी में एक वर्ग या इंटरफ़ेस होता है
java.lang.String
- सरणी में वस्तुओं का प्रकार
आउटपुट को अनुकूलित करना
कुछ अलग जब आप कॉल मुद्रित करने के लिए System.out.println(myObject)
, आप चाहिए ओवरराइडtoString()
अपनी खुद की कक्षा में विधि। यहाँ एक सरल उदाहरण दिया गया है:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
अब यदि हम प्रिंट करते हैं Person
, तो हम उनका नाम देखते हैं com.foo.Person@12345678
।
ध्यान रखें कि किसी वस्तु को स्ट्रिंग में बदलने के लिए toString()
सिर्फ एक तरीका है। आमतौर पर इस आउटपुट को स्पष्ट और संक्षिप्त तरीके से अपनी वस्तु का पूरी तरह से वर्णन करना चाहिए। toString()
हमारी Person
कक्षा के लिए बेहतर हो सकता है:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
जो प्रिंट होगा, जैसे Person[name=Henry]
,। यह डीबगिंग / परीक्षण के लिए डेटा का वास्तव में उपयोगी टुकड़ा है।
यदि आप अपनी वस्तु के सिर्फ एक पहलू पर ध्यान केंद्रित करना चाहते हैं या इसमें बहुत सारे jazzy स्वरूपण शामिल हैं, तो आप इसके बजाय एक अलग विधि को परिभाषित करने के लिए बेहतर हो सकते हैं String toElegantReport() {...}
।
आउटपुट को स्वतः उत्पन्न करना
कई आईडीईtoString()
कक्षा में खेतों के आधार पर ऑटो-जेनरेशन विधि के लिए समर्थन प्रदान करते हैं । उदाहरण के लिए ग्रहण और इंटेलीज के लिए डॉक्स देखें ।
कई लोकप्रिय जावा लाइब्रेरी इस सुविधा को प्रदान करते हैं। कुछ उदाहरणों में शामिल हैं:
वस्तुओं का मुद्रण समूह
तो आपने toString()
अपनी कक्षा के लिए एक अच्छा बनाया है । यदि उस वर्ग को एक सरणी या संग्रह में रखा जाए तो क्या होगा?
Arrays
यदि आपके पास वस्तुओं की एक सरणी है, तो आप सरणी की Arrays.toString()
सामग्री का एक सरल प्रतिनिधित्व प्रस्तुत करने के लिए कॉल कर सकते हैं। उदाहरण के लिए, Person
वस्तुओं के इस सरणी पर विचार करें :
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
नोट: यह एक स्थिर विधि के लिए एक कॉल है जिसे toString()
Arrays वर्ग में कहा जाता है, जो कि हम ऊपर चर्चा कर रहे हैं, उससे भिन्न है।
यदि आपके पास एक बहुआयामी सरणी है , तो आप Arrays.deepToString()
उसी प्रकार के आउटपुट को प्राप्त करने के लिए उपयोग कर सकते हैं ।
संग्रह
अधिकांश संग्रह .toString()
प्रत्येक तत्व पर कॉल करने के आधार पर एक सुंदर आउटपुट का उत्पादन करेंगे ।
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
तो आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपके सूची तत्व toString()
ऊपर बताए अनुसार एक अच्छा परिभाषित करें ।