कैसे जावा में ठीक से () toString ओवरराइड करने के लिए?


87

थोड़ा बेवकूफ लगता है, लेकिन मुझे अपने toString()तरीके पर मदद की ज़रूरत है और यह बहुत ही विचलित करने वाला है। मैंने ऑनलाइन देखने की कोशिश की क्योंकि toStringयह वह जगह है जहां यह खराब हो रहा है और "किड कंस्ट्रक्टर # 2 नहीं" ढूंढ रहा है, हालांकि यह वहां है और मैं कुछ और भी करूंगा और यह काम नहीं करता है। ठीक है कि यहाँ एक बहुत कुछ था मेरा कोड है:

import java.util.*; 
   class Kid {  
      String name; 
      double height; 
      GregorianCalendar bDay; 

      public Kid () { 
         this.name = "HEAD";
         this.height = 1; 
         this.bDay = new GregorianCalendar(1111,1,1); 
      } 

      public Kid (String n, double h, String date) {
      // method that toString() can't find somehow
         StringTokenizer st = new StringTokenizer(date, "/", true);
         n = this.name;
         h = this.height;
      } 

      public String toString() { 
         return Kid(this.name, this.height, this.bDay);
      } 
   } //end class 

ठीक है, तो मेरे ऊपर का तार (मुझे पता है, मेरा तीसरा पैरामीटर बंद है, स्ट्रिंग होना चाहिए) बंद है। अगर मैं तीसरी चीज़ के लिए एक मूल्य का हार्डकोड करता हूं तो वह हियरवायर हो जाता है और कहता है कि यह इसे (ऊपर) नहीं मिल सकता है। तो मैं तारीख कैसे प्राप्त कर सकता हूं और इसे कैसे तोड़ सकता हूं?

क्लास कॉलिंग यह नीचे है

class Driver {   
   public static void main (String[] args) {   
      Kid kid1 = new Kid("Lexie", 2.6, "11/5/2009");   
      System.out.println(kid1.toString());
   } //end main method 
} //end class  

मैंने कई कंस्ट्रक्टरों पर शोध करने की कोशिश की और इससे वास्तव में मदद नहीं मिली। मैंने toString()तरीकों पर शोध करने की कोशिश की , और पिछले toString()तरीकों के तर्क का उपयोग करने की कोशिश की जिसे मैंने पिछले बनाया था लेकिन यह बिल्कुल नया है इसलिए यह कभी काम नहीं किया।

मदद?


5
कृपया कोड पोस्ट करें जो वास्तव में संकलन करेगा। आपका toString()तरीका एक स्ट्रिंग वापस नहीं करता है, और आप उस तरह के एक निर्माता को नहीं बुला सकते हैं। यह स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। कृपया smallurl.com/so-hints को पढ़ें और अपने प्रश्न को स्पष्ट करें।
जॉन स्कीट

स्प्रिंग का ToStringCreator ( github.com/SpringSource/spring-framework/tree/master/… ) बहुत अच्छी तरह से काम करता है।
रितेश

FYI करें, बहुत पुरानी पुरानी समय-समय की कक्षाएं जैसे कि java.util.Date, java.util.GregorianCalendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और बाद में निर्मित java.time कक्षाओं द्वारा ली गई है । ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

जवाबों:


134

toStringएक वापस करने के लिए माना जाता है String

public String toString() { 
    return "Name: '" + this.name + "', Height: '" + this.height + "', Birthday: '" + this.bDay + "'";
} 

मेरा सुझाव है कि आप toStringविधि बनाने के लिए अपनी आईडीई की सुविधाओं का उपयोग करें । इसे हाथ से कोड न करें।

उदाहरण के लिए, ग्रहण तब कर सकते हैं जब आप स्रोत कोड पर राइट-क्लिक करें और चुनें Source > Generate toString


1
यह अच्छा अभ्यास नहीं है, जैसा कि आप स्ट्रिंग संघनन का उपयोग कर रहे हैं।
अमित

1
ऐसी स्थिति में StringBuilder एक बेहतर विकल्प है।
अमित

9
@Amit जावा संकलक StringBuilderअंतर्निहित रूप से उपयोग करता है। जब तक आप इसे लूप में उपयोग नहीं करते हैं, कोई समस्या नहीं है।
चिर्लिस -कुट्योपोटेमिमिस्टिक-

नेटबीन्स में; यह Source -> Insert Code...उसके बाद का चयन करेंtoString
Fer

10

जावा स्ट्रींग () विधि

यदि आप किसी वस्तु को एक स्ट्रिंग के रूप में दर्शाना चाहते हैं, तोString () विधि अस्तित्व में आती है।

TheString () विधि ऑब्जेक्ट का स्ट्रिंग प्रतिनिधित्व लौटाती है।

यदि आप किसी भी ऑब्जेक्ट को प्रिंट करते हैं, तो java compiler आंतरिक रूप से ऑब्जेक्ट पर theString () विधि को लागू करता है। इसलिए स्ट्रीडिंग () पद्धति को ओवरराइड करना, वांछित आउटपुट देता है, यह किसी वस्तु की स्थिति हो सकती है आदि आपके कार्यान्वयन पर निर्भर करता है।

Java toString () पद्धति का लाभ

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

आउटपुट के बिनास्ट्रिंग () विधि

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}  

Output:Student@2kaa9dc
       Student@4bbc148

आप उपरोक्त उदाहरण # 1 में देख सकते हैं। मुद्रण s1 और s2 वस्तुओं के हाशकोड मूल्यों को प्रिंट करता है लेकिन मैं इन वस्तुओं के मूल्यों को प्रिंट करना चाहता हूं। चूँकि जावा कंपाइलर आंतरिक रूप से स्ट्रींग () विधि को कॉल करता है, इस विधि को ओवरराइड करने से निर्दिष्ट मान वापस आ जाएंगे। आइए इसे नीचे दिए गए उदाहरण से समझते हैं:

Example#2

Output with overriding toString() method

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return id+" "+name+" "+address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
} 

Output:100 Joe success
       50 Jeff fail

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


4

आप (।) में नई वस्तु बना सकते हैं। उपयोग

return "Name = " + this.name +" height= " + this.height;

के बजाय

return Kid(this.name, this.height, this.bDay);

आप आवश्यकतानुसार रिटर्न स्ट्रिंग बदल सकते हैं। कैलंडर के बजाय डेट स्टोर करने के अन्य तरीके हैं।


3

आप एक निर्माता को कॉल नहीं कर सकते हैं जैसे कि यह एक सामान्य तरीका था, आप इसे केवल newएक नई वस्तु बनाने के लिए कह सकते हैं :

Kid newKid = new Kid(this.name, this.height, this.bDay);

लेकिन अपने toString () विधि से एक नई वस्तु का निर्माण वह नहीं है जो आप करना चाहते हैं।


3

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

उपयोगकर्ता को प्रदर्शित करने के लिए एक वस्तु के मूल्य का प्रतिनिधित्व करने वाले पाठ को उत्पन्न करने के लिए, दूसरी विधि जोड़ें। लोग अक्सर विधि को कुछ इस तरह का नाम देते हैं getDisplayName। उदाहरण के लिए, DayOfWeek::getDisplayNameऔर Month::getDisplayName

StringJoiner

जावा 8 और बाद में, लागू करने का सबसे आधुनिक तरीका कक्षा का toStringउपयोग करेगा StringJoiner। जैसा कि डॉक्टर कहते हैं:

StringJoiner का उपयोग एक सीमांकक द्वारा अलग किए गए वर्णों के अनुक्रम के निर्माण के लिए किया जाता है और वैकल्पिक रूप से एक आपूर्ति उपसर्ग के साथ शुरू होता है और एक आपूर्ति प्रत्यय के साथ समाप्त होता है।

इस तरह का उपयोग करें:

@Override
public String toString ()
{
    return new StringJoiner(                           // In Java 8 and later, StringJoiner is used to construct a sequence of characters separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix.
                " | " ,                                // Delimiter
                Person.class.getSimpleName() + "[ " ,  // Prefix
                " ]"                                   // Suffix
            )
            .add( "name=" + name )                     // Append
            .add( "phone=" + phone )                   // Append
            .toString();                               // Convert entire sequence to a single `String` object.
}

व्यक्ति [नाम = ऐलिस | फोन = 555.867.5309]


1
यह अधिक सुंदर है
esQmo_

2

निम्नलिखित कोड एक नमूना है। उसी के आधार पर प्रश्न, IDE आधारित रूपांतरण का उपयोग करने के बजाय, क्या इसे लागू करने का एक तेज़ तरीका है ताकि भविष्य में परिवर्तन हो, हमें बार-बार मूल्यों को संशोधित करने की आवश्यकता नहीं है?

@Override
    public String toString() {
        return "ContractDTO{" +
                "contractId='" + contractId + '\'' +
                ", contractTemplateId='" + contractTemplateId + '\'' +
                '}';
    }

2

यदि आप यूनिट-टेस्ट में रुचि रखते हैं, तो आप एक सार्वजनिक "ToStringTemplate" की घोषणा कर सकते हैं, और फिर आप अपने toString का परीक्षण कर सकते हैं। यहां तक ​​कि अगर आप इसे इकाई-परीक्षण नहीं करते हैं, तो मुझे लगता है कि इसका "क्लीनर" है और String.format का उपयोग करता है।

public class Kid {

    public static final String ToStringTemplate = "KidName='%1s', Height='%2s', GregCalendar='%3s'";

    private String kidName;
    private double height;
    private GregorianCalendar gregCalendar;

    public String getKidName() {
        return kidName;
    }

    public void setKidName(String kidName) {
        this.kidName = kidName;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public GregorianCalendar getGregCalendar() {
        return gregCalendar;
    }

    public void setGregCalendar(GregorianCalendar gregCalendar) {
        this.gregCalendar = gregCalendar;
    }

    public String toString() { 
        return String.format(ToStringTemplate, this.getKidName(), this.getHeight(), this.getGregCalendar());
    } 
}

अब आप किड बनाकर, गुणों को सेट करके, और ToStringTemplate पर अपना खुद का string.format बनाकर और तुलना करके इकाई परीक्षण कर सकते हैं।

ToStringTemplate को स्टेटिक-फाइनल करने का मतलब है यूनिट-टेस्ट में टेम्प्लेट की "कॉपी" होने के बजाय सच्चाई का "एक संस्करण"।


1

वास्तव में वास्तव में आपको कुछ इस तरह से वापस करने की आवश्यकता होगी क्योंकि स्ट्रिंग को एक स्ट्रिंग वापस करना होगा

public String toString() {
 return "Name :" + this.name + "whatever :" + this.whatever + "";
}

और आप वास्तव में उस कंस्ट्रक्टर में कुछ गलत करते हैं जिसे आप उपयोगकर्ता द्वारा नाम के लिए सेट किए गए वैरिएबल पर सेट करते हैं जबकि आपको इसके विपरीत करने की आवश्यकता होती है। आपको क्या नहीं करना चाहिए

n = this.name

तुम्हे क्या करना चाहिए

this.name = n

आशा है कि यह मदद करता है धन्यवाद


1

हम कक्षा में एक नई स्ट्रिंग ऑब्जेक्ट बनाकर भी लिख सकते हैं और यह बता सकते हैं कि हम कभी भी कंस्ट्रक्टर में क्या चाहते हैं और उस स्ट्रींग विधि को वापस कर देते हैं जिसे ओवरराइड किया जाता है

public class Student{  
 int id;  
 String name;  
 String address;  
 String details;
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 this.details=id+"  "+name+"  "+address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return details;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,"Joe","success");  
   Student s2=new Student(50,"Jeff","fail");  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}

1

हमेशा आसान तरीका होता है: राइट क्लिक करें > जनरेट करें > toString () > इच्छित टेम्प्लेट चुनें। यहाँ छवि विवरण दर्ज करें


0

मेरी राय में सबसे अच्छा तरीका Google gson पुस्तकालय का उपयोग कर रहा है:

        @Override
public String toString() {
    return new GsonBuilder().setPrettyPrinting().create().toJson(this);
}

या अपाचे कॉमन्स लैंग प्रतिबिंब तरीका है


0
  1. यदि आप नोटपैड का उपयोग कर रहे हैं: तब

    public String toString(){
    
     return ""; ---now here you can use variables which you have created for your class
    
    }
    
  2. यदि आप ग्रहण आईडीई का उपयोग कर रहे हैं तो दबाएँ

    -alt +shift +s 
    

    यहां ओवरराइड स्ट्रीडिंग विधि पर क्लिक करें, आपको यह चुनने के लिए विकल्प मिलेंगे कि आप किस प्रकार के चर का चयन करना चाहते हैं।


0

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

@ToString(of = {"name", "lastName"})

जो शुद्ध जावा के बराबर है:

public String toString() {
        return "Person(name=" + this.name + ", lastName=" + this.experienceInYears + ")";
    }

0

यदि आप toString()किसी DTO को डीबग करने के लिए उपयोग कर रहे हैं , तो आप निम्न जैसे कुछ के साथ स्वचालित रूप से मानव पठनीय आउटपुट उत्पन्न कर सकते हैं :

import com.fasterxml.jackson.databind.ObjectMapper;
...
public String toString() {
    try { return new ObjectMapper().writeValueAsString(this); }
    catch (Exception e) { return "{ObjectMapper failed}"; }
}

हालाँकि, यह उत्पादन परिनियोजन के लिए उपयुक्त नहीं है यदि DTO में PII हो सकता है (जिसे लॉग में कैप्चर नहीं किया जाना चाहिए)।

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