জাভাতে টসস্ট্রিং পদ্ধতিটি কীভাবে ব্যবহার করবেন?


118

কেউ আমাকে ধারণাটি ব্যাখ্যা করতে পারেন কি toString()Objectক্লাসে সংজ্ঞায়িত পদ্ধতিটির ? এটি কীভাবে ব্যবহৃত হয় এবং এর উদ্দেশ্য কী?



এখানেও একটি দ্রুত কৌশল / দ্রুত বাস্তবায়ন: @ ওভাররাইড পাবলিক স্ট্রিং টু স্ট্রিং () {ফিরতি 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
মূল উদ্দেশ্যটি এটি সাবক্লাসে ওভাররাইড করা। আমি মনে করি @ স্টেফেন এবং আন্দ্রেস_ডির উত্তরগুলি গৃহীত উত্তরের চেয়ে ভাল।
শ্রী রামা

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

}

... এই প্রোগ্রামটি আপনার Eclipse এ অনুলিপি করুন, এবং এটি চালান ... আপনি সম্পর্কে ধারণা পাবেন String.toString...


5
আমি আশা করি আপনি সচেতন যে toStringUI উদ্দেশ্য জন্য নয় এবং উপযুক্ত নয়।
পাওয়ারস্লেভ

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

1
@ টিমমোস আপনার বন্ধুরা যদি একটি ব্রিজ থেকে ঝাঁপ দেয় তবে আপনি কি অনুসরণ করবেন? সুইং বিকাশকারীরা কেবলমাত্র স্ট্রিং ফাংশনটি ব্যবহার করে (পড়ুন; অপব্যবহার করে) তা বোঝায় না আপনারও উচিত।
টবি Caulk

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

এটি কোনও প্রয়োগের প্রসঙ্গে optionচ্ছিকভাবে ব্যবহার করতে পারে তবে প্রায়শই এটি ডিবাগিংয়ের উদ্দেশ্যে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি যখন কোনও আইডিইতে একটি ব্রেকপয়েন্টে আঘাত করেন, অর্থবোধক পড়া এত সহজtoString() তাদের সদস্যদের তদন্ত করার চেয়ে ।

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

কোনও toString()পদ্ধতি থেকে নির্দিষ্ট আউটপুটের উপর নির্ভর করা বা এটি প্রোগ্রামের মধ্যে পার্স করা খারাপ ধারণা। আপনি যা করেন না কেন, সেই পথে নামবেন না।


2
আপনি আপনার শেষ বিবৃতিতে বিস্তারিত বলতে পারেন?
জিন-ফিলিপ কারুয়ানা

13

টুস্ট্রিং () বস্তুর একটি স্ট্রিং / পাঠ্য উপস্থাপনা প্রদান করে। ডিবাগিং, লগিং ইত্যাদির মতো ডায়াগনস্টিক উদ্দেশ্যে সাধারণত ব্যবহৃত হয়, টুস্ট্রিং () পদ্ধতিটি অবজেক্ট সম্পর্কে অর্থপূর্ণ বিবরণ পড়তে ব্যবহৃত হয়।

যখন বস্তুটি প্রিন্টলন, মুদ্রণ, প্রিন্টফ, স্ট্রিং.ফর্ম্যাট (), দৃsert়তা বা স্ট্রিং কনকেনটেশন অপারেটরের কাছে পাঠানো হয় তখন এটি স্বয়ংক্রিয়ভাবে আহ্বান করা হয়।

ক্লাস অবজেক্টে টস্ট্রিং () এর ডিফল্ট বাস্তবায়নটি এই চিহ্নটির অনুসরণ করে @ চিহ্ন এবং নিম্নলিখিত যুক্তি ব্যবহার করে এই বস্তুর হ্যাশ কোডটির স্বাক্ষরবিহীন হেক্সাডেসিমাল উপস্থাপনের পরে একটি স্ট্রিং প্রদান করে,

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. আপনি প্রায় সর্বদা toString () পদ্ধতি ওভাররাইড করা উচিত। ওভাররাইডের প্রয়োজন হবে না এমন একটি ক্ষেত্রে জাভা.ইটিল.মথের পদ্ধতিতে স্ট্যাটিক ইউটিলিটি পদ্ধতিগুলিকে গ্রুপ করে এমন ইউটিলিটি ক্লাস । ওভাররাইডের প্রয়োজন হয় না এর ঘটনাটি বেশ স্বজ্ঞাত; প্রায় সবসময় আপনি জানতে হবে।
  2. স্ট্রিংটি ফিরে আসা সংক্ষিপ্ত এবং তথ্যবহুল হতে হবে, আদর্শ স্ব-বর্ণনামূলক।
  3. কমপক্ষে, ক্ষেত্রগুলি দুটি পৃথক বস্তুর মধ্যে সমতা প্রতিষ্ঠার জন্য ব্যবহৃত হয় সমান ক্ষেত্রে ব্যবহৃত ক্ষেত্রগুলি () পদ্ধতির প্রয়োগের টসস্ট্রিং () পদ্ধতিতে ছড়িয়ে দেওয়া উচিত।
  4. ফিরতি স্ট্রিংয়ে থাকা সমস্ত দৃষ্টান্ত ক্ষেত্রের জন্য এক্সেসর / গেটর সরবরাহ করুন। উদাহরণস্বরূপ, সমন্বয়কারী ক্লাসে,

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

টোস্ট্রিং () পদ্ধতির একটি বিস্তৃত কভারেজটি বইয়ের আইটেম 10 তে রয়েছে কার্যকর জাভা Second, দ্বিতীয় সংস্করণ, জোশ ব্লচের লেখা।


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]issue


4

আপনি যখনই কোনও স্ট্রিং প্রসঙ্গে কোনও অবজেক্টে (স্ট্রিং নয়) অ্যাক্সেস করেন তখন টপস্ট্রিং () সংকলক দ্বারা কভারগুলির নীচে ডাকা হয়।

এই জন্যই

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

কাজ করে এবং নিজের ক্লাসে অবজেক্ট থেকে স্ট্যান্ডার্ড টু স্ট্রিং () কে ওভাররাইড করে আপনি স্ট্রিং প্রসঙ্গে আপনার জিনিসগুলিকেও দরকারী করে তুলতে পারেন।

(এবং এটি একটি কালো বাক্স হিসাবে বিবেচনা করুন! কখনও কখনও কোনও সামগ্রী মানুষের কাছে উপস্থাপন করা ছাড়া অন্য কোনও কিছুর জন্য ব্যবহার করবেন না)


3

স্ট্রিং পদ্ধতিতে সঠিকভাবে ওভাররাইড করা জাভা লগিং এবং ডিবাগিংয়ে সহায়তা করতে পারে।


2

ডিবাগিংয়ের ক্ষেত্রে ক্লিটাস কী জবাব দিয়েছিল সেগুলি ছাড়াও, যখনই আপনি কোনও বস্তুর আউটপুট আনেন তখনই এটি ব্যবহার করা হয় like

 System.out.println(myObject);

অথবা

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

1

টোস্ট্রিংয়ের মূল উদ্দেশ্য হ'ল কোনও জিনিসের স্ট্রিং উপস্থাপনা উত্পন্ন করা, এর অর্থ ফেরতের মান সর্বদা একটি স্ট্রিং। বেশিরভাগ ক্ষেত্রে এটি কেবল অবজেক্টের শ্রেণি এবং প্যাকেজের নাম তবে স্ট্রিংবিল্ডারের মতো কিছু ক্ষেত্রে আপনি আসলে একটি স্ট্রিং-পাঠ্য পাবেন।


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__()তবে বস্তুর প্রতিনিধিত্ব করে এমন একটি স্ট্রিং উল্লেখ করা।


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