कैसे जावा में toString विधि का उपयोग करने के लिए?


118

क्या कोई मुझे कक्षा toString()में परिभाषित पद्धति की अवधारणा को समझा सकता है Object? इसका उपयोग कैसे किया जाता है, और इसका उद्देश्य क्या है?



यहाँ एक त्वरित चाल / त्वरित-कार्यान्वयन है: @Override Public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (यह); }
ग्रानैडकोडर

जवाबों:


81

से Object.toStringडॉक्स:

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

toStringवर्ग के लिए विधि Object @ एक स्ट्रिंग वर्ग जो की वस्तु एक उदाहरण, पर हस्ताक्षर चरित्र `है के नाम से मिलकर ', और वस्तु की हैश कोड की अहस्ताक्षरित हेक्साडेसिमल प्रतिनिधित्व देता है। दूसरे शब्दों में, यह विधि एक मान के बराबर स्ट्रिंग लौटाती है:

getClass().getName() + '@' + Integer.toHexString(hashCode())

उदाहरण:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a

1
उपवर्गों में इसे खत्म करना मुख्य उद्देश्य है। मुझे लगता है कि @stephen और Andreas_D के उत्तर स्वीकृत उत्तर से बेहतर हैं।
श्री राम

39

का उपयोग String.toString:

जब भी आपको Stringफार्म में मूल्य नामक निर्माता का पता लगाने की आवश्यकता होती है , तो आप बस String.toStringउदाहरण के लिए ... का उपयोग कर सकते हैं ...

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

... इस कार्यक्रम को अपने ग्रहण में कॉपी करें, और इसे चलाएं ... आपको इसके बारे में विचार मिलेंगे String.toString...


5
मुझे आशा है कि आप इस बात toStringसे अवगत होंगे कि यूआई प्रयोजनों के लिए उपयुक्त नहीं है और उपयुक्त नहीं है।
पॉवर्सलेव

@ पॉवर्सलेव ने बताया कि toStringजीयूआई में किसी वस्तु को प्रदर्शित करने के लिए सभी स्विंग घटकों का उपयोग क्यों किया जाता है? यदि मेरे पास कोई समृद्ध वस्तु है और मैं इसे GUI में दिखाना चाहता हूं, तो नहीं, मैं इसके लिए अतिरिक्त रेंडर नहीं बनाता हूं और न ही मैं GUI में उपयोग करने के लिए ऑब्जेक्ट से बाहर एक स्ट्रिंग प्रॉपर्टी निकालता हूं, मैं इसे रखता हूं सरल और लागू toStringकरने के लिए कि सभी उपरि को दरकिनार करने में सक्षम हो। यदि आप इसे अधिक स्वच्छ तरीके से करना चाहते हैं, तो एक रैपर क्लास बनाएं, जो यूआई उद्देश्यों के लिए समर्पित है, और toStringरैपे की एक स्ट्रिंग संपत्ति वापस करने के लिए इसकी विधि को लागू करता है ।
टिम्मोस

1
@ टिमोस यदि आपके मित्र पुल से कूदते हैं तो क्या आप उसका अनुसरण करेंगे? सिर्फ इसलिए कि घुमाओ डेवलपर्स का उपयोग करें (पढ़ें; दुरुपयोग) toString फ़ंक्शन का मतलब यह नहीं है कि आपको भी चाहिए।
टोबी कॉल्क

2
यह काम पूरा करने के लिए अब तक का सबसे आसान तरीका है, बशर्ते आप डिफ़ॉल्ट स्विंग एपीआई का उपयोग करते रहें। यदि आप कस्टम रेंडरिंग चाहते हैं, तो ठीक है, अपने कंपोनेंट पर एक कस्टम रेंडर स्थापित करें। यदि आप केवल एक स्ट्रिंग द्वारा प्रतिनिधित्व की गई किसी वस्तु को प्रदर्शित करना चाहते हैं, तो कस्टम रेंडरर की तुलना में स्ट्रैसिंग () को लागू करना आसान होता है, जिसमें इसे सही करने के लिए सभी तरह के नुकसान होते हैं। मुझे लगता है कि एक पुल से कूदने के साथ आपकी तुलना विषम है।
टिममोस

35

toString()विधि एक रिटर्न शाब्दिक एक वस्तु का प्रतिनिधित्व। एक मूल कार्यान्वयन पहले से ही इसमें शामिल है java.lang.Objectऔर इसलिए कि java.lang.Objectइससे प्राप्त होने वाली सभी वस्तुओं की गारंटी है कि जावा की प्रत्येक वस्तु में यह विधि है।

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

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}

14

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

toString()विधि क्या करना चाहिए, इसके लिए कोई निर्धारित आवश्यकता नहीं है। अधिवेशन द्वारा, बहुधा यह आपको वर्ग का नाम और प्रासंगिक डेटा सदस्यों का मूल्य बताएगा। अधिक बार नहीं, toString()विधियाँ आईडीई में स्वतः उत्पन्न होती हैं।

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


2
क्या आप अपने अंतिम विवरण पर विस्तार से बता सकते हैं?
जीन-फिलिप कारुआना

13

.String () वस्तु का एक स्ट्रिंग / शाब्दिक प्रतिनिधित्व लौटाता है। आमतौर पर डिबगिंग, लॉगिंग आदि जैसे नैदानिक ​​उद्देश्यों के लिए उपयोग किया जाता है, ऑब्जेक्ट के बारे में सार्थक विवरण पढ़ने के लिए स्ट्रीस्टिंग () विधि का उपयोग किया जाता है।

जब ऑब्जेक्ट को println, Print, Printf, String.format (), assert या string concatenation ऑपरेटर को पास किया जाता है, तो यह स्वचालित रूप से लागू होता है।

क्लास ऑब्जेक्ट में स्ट्रींग () का डिफ़ॉल्ट कार्यान्वयन इस ऑब्जेक्ट के वर्ग नाम से युक्त एक स्ट्रिंग देता है, जिसके बाद @ साइन होता है और इस तर्क के हैश कोड के अहस्ताक्षरित हेक्साडेसिमल का प्रतिनिधित्व निम्न लॉजिक का उपयोग करके किया जाता है,

getClass().getName() + "@" + Integer.toHexString(hashCode())

उदाहरण के लिए, निम्नलिखित

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

प्रिंट

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

अब, नीचे दिए गए निर्देशांक वर्ग में ओवरराइडिंग () को छोड़कर,

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

का परिणाम

Bourne's current location - (1.0, 2.0) //concise and informative

ओवरराइडिंग स्ट्रेसिंग () की उपयोगिता तब और अधिक हो जाती है जब इन ऑब्जेक्ट्स के संदर्भ वाले संग्रह पर विधि लागू की जाती है। उदाहरण के लिए, निम्नलिखित

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

प्रिंट

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

इसके अलावा,

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

कुछ कार्यान्वयन बिंदु,

  1. आपको लगभग हमेशा स्ट्रींग () विधि को ओवरराइड करना चाहिए। ऐसे मामलों में से एक जहां ओवरराइड की आवश्यकता नहीं होगी, वह उपयोगिता वर्ग है जो समूह स्थैतिक उपयोगिता विधियों, java.util.Math के तरीके से है । ओवरराइड की आवश्यकता नहीं होने का मामला बहुत सहज है; लगभग हमेशा आपको पता होगा।
  2. लौटी हुई स्ट्रिंग संक्षिप्त और सूचनात्मक होनी चाहिए, आदर्श रूप से आत्म-व्याख्यात्मक।
  3. कम से कम, फ़ील्ड्स को दो अलग-अलग ऑब्जेक्ट्स के बीच समतुल्य स्थापित करने के लिए उपयोग किया जाता है अर्थात समान फ़ील्ड्स () मेथड इम्प्लीमेंटेशन में उपयोग किए जाने वाले फ़ील्ड को स्ट्रीस्टिंग () विधि द्वारा थूक दिया जाना चाहिए।
  4. लौटे स्ट्रिंग में शामिल सभी उदाहरण क्षेत्रों के लिए एक्सेसर्स / गेटर्स प्रदान करें। उदाहरण के लिए, निर्देशांक वर्ग में,

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    

पुस्तक के आइटम 10 में स्टैस्टरिंग () पद्धति का एक व्यापक कवरेज प्रभावी जावा ™, दूसरा संस्करण, जोश बलोच द्वारा दिया गया है।


6

कोडन:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

आउटपुट:

[स्टीव 12 डैनियल, सचिन 10 तेंदुलकर]

[स्टीव 12 डैनियल, सचिन 10 तेंदुलकर, युवी 12 भज्जी]

यदि आप पूजो (स्टूडेंट.जावा) क्लास में स्ट्रींग () का उपयोग नहीं करते हैं, तो आपको आउटपुट मिल जाएगा [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]। इस तरह के मुद्दे से बचने के लिए हम स्ट्रींग () विधि का उपयोग कर रहे हैं।


4

जब भी आप किसी ऑब्जेक्ट को एक स्ट्रिंग (संदर्भ में नहीं होना) तक पहुँचते हैं, तो संकलक द्वारा कवर () को स्ट्रिंग्स के अंतर्गत कहा जाता है।

इसलिए

Map map = new HashMap();
System.out.println("map=" + map);

काम करता है, और अपनी कक्षाओं में ऑब्जेक्ट से मानक toString () को ओवरराइड करके, आप अपनी वस्तुओं को स्ट्रिंग संदर्भों में भी उपयोगी बना सकते हैं।

(और इसे एक ब्लैक बॉक्स पर विचार करें! कभी भी, किसी भी चीज़ को मानव के लिए प्रस्तुत करने की तुलना में उपयोग न करें)


3

सही ढंग से ओवरराइड की गई स्ट्रीटिंग विधि जावा के लॉगिंग और डिबगिंग में मदद कर सकती है।


2

डिबगिंग के संबंध में कैलेटस ने जो उत्तर दिया, उसके अलावा इसका उपयोग तब किया जाता है जब आप किसी वस्तु का उत्पादन करते हैं, जैसे कि जब आप उपयोग करते हैं

 System.out.println(myObject);

या

System.out.println("text " + myObject);

1

String का मुख्य उद्देश्य किसी वस्तु का String प्रतिनिधित्व उत्पन्न करना है, इसका मतलब है कि return value हमेशा एक String होता है। ज्यादातर मामलों में यह बस ऑब्जेक्ट का वर्ग और पैकेज का नाम है, लेकिन कुछ मामलों जैसे स्ट्रिंगबर्ल पर आपको वास्तव में स्ट्रिंग-पाठ मिलेगा।


0
/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}

0

यदि आप पहले पायथन सीखते हैं और फिर जावा। मुझे लगता है कि यह __str__()पायथन में विधि के रूप में एक ही भूमिका निभाता है , यह एक जादू की तरह विधि है __dict__()और __init__()एक स्ट्रिंग को संदर्भित करने के लिए वस्तु का प्रतिनिधित्व करता है।


-1

toString()निर्दिष्ट ऑब्जेक्ट को स्ट्रिंग मान में कनवर्ट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.