2012-04-24 3 views
16

जावा में ऑब्जेक्ट्स सरणी के लिए टॉस्ट्रिंग को ओवरराइड करना संभव है?जावा में ऑब्जेक्ट्स सरणी के लिए 'toString' को ओवरराइड करना संभव है?

उदाहरण के लिए, मान लीजिए कि मैंने एक साधारण वर्ग, User बनाया है (यह वास्तव में कोई फर्क नहीं पड़ता कि यह कौन सा वर्ग है क्योंकि यह एक सामान्य प्रश्न है)। क्या यह संभव है कि, क्लाइंट User[] सरणी बनाता है और ग्राहक System.out.print(array) का उपयोग करता है, तो यह सरणी के पते को प्रिंट नहीं करेगा बल्कि इसके बजाय toString() अनुकूलित किया जाएगा?

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

+0

कुछ 'java.util.Arrays.toString की तरह नहीं लगता है (सरणी) '। –

+3

ध्यान दें कि 'ऑब्जेक्ट []। ToString() '** ** ** ** सरणी के" पता "को वापस नहीं करता है। यह सरणी [पहचान हैश कोड] लौटाता है (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode (java.lang.Object))। –

उत्तर

17

नहीं। बेशक आप एक स्थिर विधि User.toString (उपयोगकर्ता []) बना सकते हैं, लेकिन इसे स्पष्ट रूप से नहीं कहा जाएगा।

+0

मैं मुद्रण के लिए स्थिर तरीकों का उपयोग नहीं करना चाहता, मैं किसी भी पैरामीटर के साथ toString() को प्राप्त करने की कोशिश कर रहा हूं .. – Popokoko

+6

समझा। यही कारण है कि मेरे उत्तर का पहला शब्द "नहीं" था। –

4

आप सरणी युक्त एक अलग वर्ग बना सकते हैं, और toString() ओवरराइड कर सकते हैं।

मुझे लगता है कि सबसे आसान समाधान ArrayList वर्ग का विस्तार करना है, और बस toString() (उदाहरण के लिए, UserArrayList) को ओवरराइड करना है।

+1

ओपी एक ऐरेलिस्ट का उपयोग नहीं कर रहा है, वह एक सरणी का उपयोग कर रहा है। – EJP

9

आप Arrays.toString(Object[] a); का उपयोग कर सकते हैं जो सरणी में प्रत्येक ऑब्जेक्ट पर toString() विधि को कॉल करेगा।

संपादित करें (टिप्पणी से):

मैं समझता हूँ कि यह क्या आप प्राप्त करना चाहते हैं, लेकिन जावा का समर्थन नहीं करता इस समय है।

जावा में, सरणी ऐसी वस्तुएं होती हैं जो गतिशील रूप से बनाई जाती हैं और ऑब्जेक्ट प्रकार के चर के लिए असाइन की जा सकती हैं। कक्षा ऑब्जेक्ट के सभी तरीकों को एक सरणी पर बुलाया जा सकता है। JLS Ch10

जब आप किसी ऑब्जेक्ट पर toString() का आह्वान करते हैं तो यह एक स्ट्रिंग देता है जो ऑब्जेक्ट को "पाठ रूप से दर्शाता है"। चूंकि एक सरणी ऑब्जेक्ट का एक उदाहरण है, इसलिए आपको केवल कक्षा का नाम, @ और हेक्स मान मिलता है। देखें Object#toString

Arrays.toString() विधि एक सूची के रूप में सरणी के बराबर लौटाता है, जिसे पुन: चालू किया जाता है और सूची में प्रत्येक ऑब्जेक्ट पर toString() कहा जाता है।

तो जब आप System.out.println(userList); करने में सक्षम नहीं होंगे, तो आप System.out.println(Arrays.toString(userList); कर सकते हैं जो अनिवार्य रूप से वही चीज़ प्राप्त करेगा।

+0

मुझे अभी भी समझ में नहीं आता कि मैं जो चाहता हूं उसे प्राप्त करता हूं, मान लेता है कि मेरे पास कुछ कक्षा है, मैं चाहता हूं कि यह वर्ग किसी सरणी प्रकार के लिए "स्ट्रिंग() का समर्थन करे। एक उदाहरण: क्लास [] सरणी = नई कक्षा [3] बनाना, एक बार System.out.println (सरणी) निष्पादित हो जाने के बाद, उस वर्ग के लिए एक toString() होगा। – Popokoko

3

एकमात्र तरीका यह है कि आप इसे कर सकते हैं Object.toString() को फिर से संकलित करना और instanceof खंड जोड़ें।

मैंने एक और ऑब्जेक्ट उन्मुख तरीके से सरणी को संभालने के लिए प्रोजेक्ट सिक्का में बदलाव का अनुरोध किया था। मुझे लगा कि शुरुआती लोगों के लिए ऐरे, Arrays और 7 अन्य सहायक वर्गों में आपको आवश्यक सभी कार्यक्षमताओं को सीखना बहुत अधिक है।

मुझे लगता है कि अंत में यह निष्कर्ष निकाला गया था कि सरणी को उचित रूप से ऑब्जेक्ट करने के लिए एक गैर-तुच्छ कार्य है जिसे जावा 9 या उसके बाद वापस धकेल दिया जाएगा।

0

आप ऐसा नहीं कर सकते हैं। जब आप एक सरणी घोषित करते हैं, तो वास्तव में जावा ऐरे के प्रकार की एक छुपे ऑब्जेक्ट बनाता है। यह एक विशेष प्रकार की कक्षा है (उदाहरण के लिए, यह इंडेक्स एक्सेस [] ऑपरेटर का समर्थन करता है) जो सामान्य कोड सीधे एक्सेस नहीं कर सकता है।

यदि आप ToString() को ओवरराइड करना चाहते हैं, तो आपको इस कक्षा का विस्तार करना होगा। लेकिन आप इसे नहीं कर सकते, क्योंकि यह छिपा हुआ है।

मुझे लगता है कि यह इस तरह से अच्छा है। यदि कोई ऐरे वर्ग का विस्तार कर सकता है, तो कोई वहां सभी प्रकार के तरीकों को जोड़ सकता है। और जब कोई और इस कोड का प्रबंधन करता है, तो वे सरणी पर कस्टम तरीकों को देखते हैं और वे "डब्ल्यूटीएफ ... क्या यह सी ++ या क्या है?"।

0

ठीक है, आप सभी कॉल को Object.toString पर AspectJ के साथ advice के साथ लपेटने का प्रयास कर सकते हैं और सरणी के लिए वांछित आउटपुट वापस कर सकते हैं। हालांकि, मैं यह एक अच्छा समाधान :)

2

है इस

User[] array = new User[2]; 
System.out.println(Arrays.asList(array)); 
मोटे की

प्रयास करें आप कस्टमाइज़ कर लिया है, तो user.toString() विधि

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