Adakah yang bisa menjelaskan kepada saya konsep toString()metode, yang didefinisikan di Objectkelas? Bagaimana cara menggunakannya, dan apa tujuannya?
Adakah yang bisa menjelaskan kepada saya konsep toString()metode, yang didefinisikan di Objectkelas? Bagaimana cara menggunakannya, dan apa tujuannya?
Jawaban:
Dari Object.toStringdokumen:
Mengembalikan representasi string dari objek. Secara umum,
toStringmetode 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 kelasObjectmengembalikan 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
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...
toStringitu tidak dimaksudkan dan tidak cocok untuk keperluan UI.
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.
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()+"]";
}
}
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.
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,
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.
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 ().
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)
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.
/**
* 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();
}
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.