Bagaimana cara menggunakan metode toString di Java?


118

Adakah yang bisa menjelaskan kepada saya konsep toString()metode, yang didefinisikan di Objectkelas? Bagaimana cara menggunakannya, dan apa tujuannya?



berikut adalah trik cepat / implementasi cepat juga: @Override public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (this); }
granadaCoder

Jawaban:


81

Dari Object.toStringdokumen:

Mengembalikan representasi string dari objek. Secara umum, toString metode ini mengembalikan string yang "mewakili secara tekstual" objek ini. Hasilnya harus berupa representasi yang ringkas tetapi informatif yang mudah dibaca oleh seseorang. Direkomendasikan agar semua subclass mengganti metode ini.

The toStringmetode untuk kelas Object mengembalikan sebuah string yang terdiri dari nama kelas yang objek adalah sebuah contoh, karakter di-tanda `@', dan heksadesimal representasi unsigned kode hash objek. Dengan kata lain, metode ini mengembalikan string yang sama dengan nilai:

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

Contoh:

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

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

1
Tujuan utamanya adalah untuk menggantinya di subclass. Saya pikir jawaban dari @stephen dan Andreas_D lebih baik daripada jawaban yang diterima.
Sree Rama

39

Penggunaan String.toString:

Setiap kali Anda perlu menjelajahi konstruktor yang disebut nilai dalam Stringformulir, Anda dapat menggunakan String.toString... sebagai contoh ...

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

}

... salin program ini ke Eclipse Anda, dan jalankan ... Anda akan mendapatkan ide tentang String.toString...


5
Saya harap Anda tahu bahwa toStringitu tidak dimaksudkan dan tidak cocok untuk keperluan UI.
Powerslave

@Powerslave lalu jelaskan mengapa semua komponen Swing digunakan toStringuntuk menampilkan objek di GUI? Jika saya memiliki objek kaya dan saya ingin menampilkannya di GUI, maka tidak, saya tidak membuat penyaji tambahan untuknya dan saya juga tidak mengekstrak properti string dari objek untuk menggunakannya di GUI, saya menyimpannya sederhana dan diimplementasikan toStringuntuk dapat menghindari semua overhead itu. Jika Anda ingin melakukan ini dengan cara yang lebih bersih, buat kelas pembungkus yang didedikasikan untuk tujuan UI, dan terapkan toStringmetodenya untuk mengembalikan properti string dari pembungkus.
Timmos

1
@Timmos Jika teman Anda melompat dari jembatan, apakah Anda akan mengikuti? Hanya karena pengembang Swing menggunakan (baca; penyalahgunaan) fungsi toString tidak berarti Anda juga harus melakukannya.
Toby Caulk

2
Sejauh ini, ini adalah pendekatan yang paling mudah untuk menyelesaikan pekerjaan, mengingat Anda tetap menggunakan API Swing default. Jika Anda ingin rendering kustom, baiklah, instal renderer kustom pada komponen Anda. Jika Anda hanya ingin menampilkan objek yang direpresentasikan oleh String, maka menerapkan toString () jauh lebih mudah dibandingkan dengan perender khusus, yang memiliki semua jenis perangkap untuk melakukannya dengan benar. Menurut saya perbandingan Anda dengan melompat dari jembatan itu aneh.
Timmos

35

The toString()Metode mengembalikan tekstual representasi dari sebuah objek. Implementasi dasar sudah termasuk di dalamnya java.lang.Objectdan karena semua objek yang diturunkan java.lang.Objectdarinya dijamin bahwa setiap objek di Java memiliki metode ini.

Mengganti metode selalu merupakan ide yang bagus, terutama jika berkaitan dengan debugging, karena debugger sering menampilkan objek berdasarkan hasil dari toString() metode. Jadi gunakan implementasi yang berarti tetapi gunakan untuk tujuan teknis . Logika aplikasi harus menggunakan getter:

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

Secara opsional, ini dapat digunakan dalam konteks aplikasi tetapi jauh lebih sering digunakan untuk tujuan debugging. Misalnya, saat Anda mencapai breakpoint dalam IDE, jauh lebih mudah untuk membaca objek yang bermakna toString()daripada memeriksa anggotanya.

Tidak ada persyaratan yang ditetapkan untuk toString()metode apa yang harus dilakukan. Menurut konvensi, paling sering ini akan memberi tahu Anda nama kelas dan nilai anggota data terkait. Lebih sering daripada tidak, toString()metode dibuat secara otomatis di IDE.

Mengandalkan keluaran tertentu dari suatu toString()metode atau menguraikannya dalam program adalah ide yang buruk. Apa pun yang Anda lakukan, jangan lakukan itu.


2
bisakah Anda menjelaskan pernyataan terakhir Anda?
Jean-Philippe Caruana

13

toString () mengembalikan representasi string / tekstual dari objek. Biasanya digunakan untuk tujuan diagnostik seperti debugging, logging, dll., Metode toString () digunakan untuk membaca detail yang berarti tentang objek.

Ini secara otomatis dipanggil ketika objek diteruskan ke println, print, printf, String.format (), assert atau operator penggabungan string.

Implementasi default toString () di kelas Objek mengembalikan string yang terdiri dari nama kelas objek ini diikuti oleh tanda @ dan representasi heksadesimal unsigned dari kode hash objek ini menggunakan logika berikut,

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

Misalnya berikut ini

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

cetakan

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

Sekarang, menimpa toString () di kelas Koordinat seperti di bawah ini,

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

menghasilkan

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

Kegunaan mengganti toString () menjadi lebih ketika metode dipanggil pada koleksi yang berisi referensi ke objek ini. Misalnya berikut ini

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

cetakan

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

alih-alih ini,

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

Beberapa petunjuk implementasi,

  1. Anda hampir selalu harus mengganti metode toString (). Salah satu kasus di mana penggantian tidak diperlukan adalah kelas utilitas yang mengelompokkan metode utilitas statis, dengan cara java.util.Math . Kasus override yang tidak diperlukan cukup intuitif; hampir selalu Anda akan tahu.
  2. String yang dikembalikan harus ringkas dan informatif, idealnya sudah cukup jelas.
  3. Setidaknya, bidang yang digunakan untuk menetapkan kesetaraan antara dua objek berbeda yaitu bidang yang digunakan dalam persamaan () implementasi metode harus dikeluarkan oleh metode toString ().
  4. Berikan pengakses / pengambil untuk semua bidang instance yang terdapat dalam string yang dikembalikan. Misalnya, di kelas Koordinat,

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

Cakupan yang komprehensif dari metode toString () ada di Item 10 dari buku, Effective Java ™, Edisi Kedua, Oleh Josh Bloch.


6

Coding:

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

Keluaran:

[Steve 12 Daniel, Sachin 10 Tendulkar]

[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]

Jika Anda tidak digunakan toString () di kelas Pojo (Student.java), Anda akan mendapatkan output seperti [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Untuk menghindari masalah seperti ini, kami menggunakan metode toString ().


4

Setiap kali Anda mengakses Objek (bukan String) dalam konteks String maka toString () dipanggil di bawah penutup oleh kompilator.

Ini sebabnya

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

berfungsi, dan dengan menimpa toString () standar dari Object di kelas Anda sendiri, Anda dapat membuat objek Anda berguna dalam konteks String juga.

(dan anggap itu kotak hitam! Jangan pernah menggunakan isinya untuk hal lain selain untuk ditampilkan kepada manusia)


3

Metode toString yang diganti dengan benar dapat membantu dalam logging dan debugging Java.


2

Terlepas dari apa yang dijawab cletus sehubungan dengan debugging, itu digunakan setiap kali Anda mengeluarkan objek, seperti saat Anda menggunakannya

 System.out.println(myObject);

atau

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

1

Tujuan utama toString adalah untuk menghasilkan representasi String dari suatu objek, artinya nilai yang dikembalikan selalu berupa String. Dalam kebanyakan kasus, ini hanyalah kelas objek dan nama paket, tetapi pada beberapa kasus seperti StringBuilder Anda sebenarnya akan mendapatkan teks-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

Jika Anda mempelajari Python terlebih dahulu, lalu Java. Saya pikir itu memainkan peran yang sama sebagai __str__()metode di Python, itu adalah metode ajaib seperti __dict__()dan __init__()tetapi untuk merujuk ke string yang mewakili objek.


-1

yang toString()mengubah objek yang ditentukan menjadi nilai string.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.