জাভায় টুস্ট্রিং () কীভাবে ওভাররাইড করা যায়?


88

কিছুটা বোকা লাগছে, তবে আমার 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()আমি পূর্ববর্তী পদ্ধতিগুলির যুক্তিগুলি ব্যবহার করার চেষ্টা করেছি যা আমি আগে তৈরি করেছি কিন্তু এটি একেবারেই নতুন তাই এটি কখনই কাজ করেনি।

সাহায্য?


4
কোডটি পোস্ট করুন যা আসলে সংকলন করবে। আপনার toString()পদ্ধতিটি কোনও স্ট্রিং ফিরিয়ে দেয় না এবং আপনি এটির মতো কোনও কনস্ট্রাক্টরকে কল করতে পারবেন না। আপনি কী অর্জন করার চেষ্টা করছেন তা অস্পষ্ট। দয়া করে tinyurl.com/so- ইঙ্গিতগুলি পড়ুন এবং আপনার প্রশ্নটি স্পষ্ট করুন।
জন স্কিটি

স্প্রিংয়ের টসস্ট্রিংক্রিটর ( github.com/SpringSource/spring-framework/tree/master/… ) কাজটি খুব সুন্দর করে করে।
রীতেশ

অবগতির জন্য, যেমন ভয়ঙ্কর বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.GregorianCalendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted, java.time জাভা 8 এবং পরে পাতাটা ক্লাস। ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বাসিল বাউর্ক

উত্তর:


136

toStringএকটি ফিরতি অনুমিত হয় String

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

আমি আপনাকে toStringপদ্ধতিটি তৈরি করতে আপনার আইডিই এর বৈশিষ্ট্যগুলি ব্যবহার করার পরামর্শ দিচ্ছি । এটি হ্যান্ড-কোড করবেন না।

উদাহরণস্বরূপ, যদি আপনি সোর্স কোডটিতে ডান ক্লিক করেন এবং নির্বাচন করেন তবে Eclipse এটি করতে পারে Source > Generate toString


4
এটি ভাল অনুশীলন নয়, যেহেতু আপনি স্ট্রিং কনটেনটেশন ব্যবহার করছেন।
অমিত

4
স্ট্রিংবিল্ডার এমন পরিস্থিতিতে একটি ভাল পছন্দ।
অমিত

9
@ অ্যামিট জাভা সংকলক সুস্পষ্টভাবে ব্যবহার করে StringBuilder। আপনি এটি লুপে ব্যবহার না করে কোনও সমস্যা নেই।
ক্রাইলিস -কোটিরিওপটিস্টিস্টিক-

নেটবিনে; এটি তার অধীনে Source -> Insert Code...নির্বাচন করুনtoString
ফের

11

জাভা টুস্ট্রিং () পদ্ধতি

আপনি যদি কোনও বস্তুকে স্ট্রিং হিসাবে উপস্থাপন করতে চান তবে টসস্ট্রিং () পদ্ধতিটি বিদ্যমান।

টসস্ট্রিং () পদ্ধতিটি বস্তুর স্ট্রিং প্রতিনিধিত্ব করে।

আপনি যদি কোনও বস্তু মুদ্রণ করেন, জাভা সংকলক অভ্যন্তরীণভাবে অবজেক্টে টসস্ট্রিং () পদ্ধতিটি আহ্বান করে। সুতরাং টসস্ট্রিং () পদ্ধতিটি ওভাররাইড করে কাঙ্ক্ষিত আউটপুট দেয়, এটি কোনও বস্তুর অবস্থা ইত্যাদি হতে পারে আপনার প্রয়োগের উপর নির্ভর করে।

জাভা টুস্ট্রিং () পদ্ধতির সুবিধা

অবজেক্ট ক্লাসের 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

নোট করুন যে টুস্ট্রিং () বেশিরভাগ ক্ষেত্রে জাভাতে পলিমারফিজমের ধারণার সাথে সম্পর্কিত। ইন, ইক্লিপস, টু স্ট্রিং () এ ক্লিক করার চেষ্টা করুন এবং এটিতে ডান ক্লিক করুন। তারপরে ওপেন ডিক্লেয়ারেশনে ক্লিক করুন এবং দেখুন সুপারক্লাস টু স্ট্রিং () কোথা থেকে এসেছে।


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);

তবে আপনার টস্ট্রিং () পদ্ধতি থেকে একটি নতুন অবজেক্ট তৈরি করা আপনি যা করতে চান তা তা নয়।


3

অন্যরা যেমন ব্যাখ্যা করেছে, toStringআপনার ক্লাসটি ইনস্ট্যান্ট করার জায়গা নয়। পরিবর্তে, toStringপদ্ধতিটি আপনার শ্রেণীর উদাহরণের মান উপস্থাপন করে একটি স্ট্রিং তৈরি করার উদ্দেশ্যে, সেই বস্তুটিতে সঞ্চিত ডেটা অন্তত সর্বাধিক গুরুত্বপূর্ণ ক্ষেত্রগুলির প্রতিবেদন করা। বেশিরভাগ ক্ষেত্রে, toStringআপনার ব্যবসায়িক যুক্তির জন্য নয়, ডিবাগিং এবং লগিংয়ের জন্য ব্যবহৃত হয়।

কোনও ব্যবহারকারীর কাছে প্রদর্শনের জন্য কোনও সামগ্রীর মান উপস্থাপন করে পাঠ্য উত্পন্ন করতে, অন্য একটি পদ্ধতি যুক্ত করুন। লোকেরা প্রায়শই এই পদ্ধতির নাম দেয় getDisplayName। উদাহরণস্বরূপ, DayOfWeek::getDisplayNameএবং Month::getDisplayName

StringJoiner

জাভা 8 এবং পরবর্তী হিসাবে, প্রয়োগের সবচেয়ে আধুনিক উপায়টি ক্লাসটি toStringব্যবহার করবে 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]


4
এটি আরও মার্জিত
esQmo_

2

নিম্নলিখিত কোডটি একটি নমুনা। একই ভিত্তিতে প্রশ্ন, আইডিই ভিত্তিক রূপান্তর ব্যবহারের পরিবর্তে, বাস্তবায়নের আরও দ্রুত উপায় কি যাতে ভবিষ্যতে পরিবর্তনগুলি ঘটে, আমাদের বারবার মানগুলি সংশোধন করার প্রয়োজন হয় না?

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

2

আপনি যদি ইউনিট-টেস্টগুলিতে আগ্রহী হন, তবে আপনি একটি সর্বজনীন "ToStringTemplate" ঘোষণা করতে পারেন, এবং তারপরে আপনি নিজের টস্ট্রিং ইউনিট পরীক্ষা করতে পারেন। এমনকি যদি আপনি এটি ইউনিট-টেস্ট না করেন তবে আমি মনে করি এটি "ক্লিনার" এবং স্ট্রিং.ফর্ম্যাট ব্যবহার করে।

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 এবং তুলনা করে পরীক্ষা করতে পারেন unit

টোস্ট্রিংটেম্পলেট স্থির-চূড়ান্ত করার অর্থ ইউনিট-টেস্টে টেমপ্লেটের "অনুলিপি" না রেখে সত্যের "এক সংস্করণ"।


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টীকা, যার মধ্যে একটি বাস্তবায়ন উত্পন্ন করবে toString()পদ্ধতি। ডিফল্টরূপে, এটি প্রতিটি শ্রেণীর সাথে কমা দ্বারা পৃথক হয়ে আপনার শ্রেণীর নাম প্রিন্ট করবে। আপনি টীকাতে পরামিতিগুলি পেরিয়ে সহজেই আপনার আউটপুট কাস্টমাইজ করতে পারেন, যেমন:

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

যা খাঁটি জাভার সমতুল্য:

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

1

আপনি যদি কেবল toString()কোনও ডিটিও ডিবাগিংয়ের জন্য ব্যবহার করেন তবে আপনি নিম্নলিখিত জাতীয় কিছু দিয়ে স্বয়ংক্রিয়ভাবে মানব পাঠযোগ্য আউটপুট তৈরি করতে পারেন:

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

তবে ডিটিওতে পিআইআই থাকতে পারে (যা লগগুলিতে ক্যাপচার করা উচিত নয়) এটি উত্পাদন স্থাপনার জন্য উপযুক্ত নয়।


1

সর্বদা সহজ উপায়: ডান ক্লিক করুন > জেনারেট > টু স্ট্রিং () > আপনি যে টেম্পলেটটি চান তা নির্বাচন করুন। এখানে চিত্র বর্ণনা লিখুন


0

আমার মতে সর্বোত্তম উপায় হ'ল গুগল জিএসএন লাইব্রেরি ব্যবহার করা:

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

বা অ্যাপাচি কমন্স ল্যাং প্রতিবিম্ব উপায় way


0
  1. আপনি যদি নোটপ্যাড ব্যবহার করে থাকেন: তবে

    public String toString(){
    
     return ""; ---now here you can use variables which you have created for your class
    
    }
    
  2. আপনি যদি গ্রহপ আইডিই ব্যবহার করছেন তবে টিপুন

    -alt +shift +s 
    

    এখানে ওভাররাইড টু স্ট্রিং পদ্ধতিতে ক্লিক করুন আপনি কোন ধরণের ভেরিয়েবল নির্বাচন করতে চান তা নির্বাচন করতে বিকল্প পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.