Java'da toString yöntemi nasıl kullanılır?


118

Sınıfta toString()tanımlanan yöntem kavramını bana açıklayan var Objectmı? Nasıl kullanılır ve amacı nedir?



hızlı bir hile / hızlı uygulama da burada: @Override public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (this); }
granadaCoder

Yanıtlar:


81

Gönderen Object.toStringdocs:

Nesnenin dize gösterimini döndürür. Genel olarak, toString yöntem bu nesneyi "metin olarak temsil eden" bir dize döndürür. Sonuç, bir kişinin okuması kolay olan kısa ama bilgilendirici bir sunum olmalıdır. Tüm alt sınıfların bu yöntemi geçersiz kılması önerilir.

toStringSınıfı için bir yöntem Object nesnesi bir örneği, en işareti karakter 'olduğu sınıf adına oluşan bir dizi @ ve nesnenin karma kod işaretsiz onaltılık döndürür. Başka bir deyişle, bu yöntem şunun değerine eşit bir dize döndürür:

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

Misal:

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

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

1
Ana amaç, alt sınıflarda onu geçersiz kılmaktır. @Stephen ve Andreas_D'den gelen cevapların kabul edilen cevaptan daha iyi olduğunu düşünüyorum.
Sree Rama

39

Aşağıdakilerin kullanımı String.toString:

StringFormda değer adı verilen kurucuyu keşfetmeniz gerektiğinde , basitçe kullanabilirsiniz String.toString... bir örnek için ...

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

}

... bu programı Eclipse'inize kopyalayın ve çalıştırın ... hakkındaki fikirleri alacaksınız String.toString...


5
Umarım toStringbunun amaçlanmadığını ve kullanıcı arayüzü amaçlarına uygun olmadığını biliyorsunuzdur .
Powerslave

@Powerslave, o zaman neden tüm Swing bileşenlerinin toStringGUI'de bir nesneyi görüntülemek için kullandığını açıklayın ? Zengin bir nesnem varsa ve onu bir GUI'de göstermek istiyorsam, o zaman hayır, onun için fazladan bir oluşturucu oluşturmam veya GUI'de kullanmak için nesneden bir dize özelliği çıkarmam, onu saklarım toStringtüm bu ek yüklerin üstesinden gelebilmek için basit ve gerçek . Bunu daha temiz bir şekilde yapmak istiyorsanız, UI amaçlarına ayrılmış bir sarmalayıcı sınıfı oluşturun ve bunun toStringyöntemini wrappee'nin bir dize özelliğini döndürmek için uygulayın.
Timmos

1
@Timmos Arkadaşlarınız bir köprüden atlasaydı takip eder miydiniz? Swing geliştiricilerinin toString işlevini kullanması (oku; kötüye kullan), sizin de kullanmanız gerektiği anlamına gelmez.
Toby Caulk

2
Varsayılan Swing API'yi kullanmaya devam ettiğiniz göz önüne alındığında, işi halletmek için en kolay yaklaşım budur. Özel oluşturma istiyorsanız, bileşeninize özel bir oluşturucu yükleyin. Yalnızca bir String ile temsil edilen bir nesneyi görüntülemek istiyorsanız, toString () uygulamak, her türlü tuzağı doğru şekilde yapmak için özel bir oluşturucuya kıyasla çok daha kolaydır. Bir köprüden atlamakla karşılaştırmanızın tuhaf olduğunu düşünüyorum.
Timmos

35

toString()Yöntem, bir döner metinsel bir nesnenin temsil. Temel bir uygulama zaten dahil edilmiştir java.lang.Objectve bu nedenle tüm nesneler java.lang.Objectondan miras aldığından, Java'daki her nesnenin bu yönteme sahip olması garanti edilir.

Yöntemin geçersiz kılınması, özellikle hata ayıklama söz konusu olduğunda her zaman iyi bir fikirdir, çünkü hata ayıklayıcılar genellikle nesneleri toString()yöntemin sonucuna göre gösterir . Bu yüzden anlamlı bir uygulama kullanın, ancak bunu teknik amaçlar için kullanın . Uygulama mantığı alıcıları kullanmalıdır:

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

İsteğe bağlı olarak bir uygulama bağlamında kullanımlara sahip olabilir, ancak çok daha sık olarak hata ayıklama amacıyla kullanılır. Örneğin, bir IDE'de bir kesme noktasına ulaştığınızda, anlamlı toString()bir nesneyi okumak , üyelerini incelemekten çok daha kolaydır .

Bir toString()yöntemin ne yapması gerektiğine dair belirli bir gereklilik yoktur. Kural olarak, çoğu zaman size sınıfın adını ve ilgili veri üyelerinin değerini söyleyecektir. Çoğu zaman, toString()yöntemler IDE'lerde otomatik olarak oluşturulur.

Bir toString()yöntemden belirli çıktılara güvenmek veya onu bir program içinde ayrıştırmak kötü bir fikirdir. Ne yaparsan yap, o yoldan gitme.


2
son ifadenizi detaylandırır mısınız?
Jean-Philippe Caruana

13

toString () , nesnenin bir dize / metin gösterimini döndürür. Genellikle hata ayıklama, günlük kaydı vb. Gibi teşhis amaçları için kullanılan toString () yöntemi, nesne hakkında anlamlı ayrıntıları okumak için kullanılır.

Nesne println, print, printf, String.format (), assert veya dize birleştirme operatörüne iletildiğinde otomatik olarak çağrılır.

Object sınıfındaki toString () öğesinin varsayılan uygulaması, bu nesnenin sınıf adını ve ardından @ işaretini ve aşağıdaki mantığı kullanarak bu nesnenin karma kodunun işaretsiz onaltılı temsilini içeren bir dize döndürür:

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

Örneğin, aşağıdaki

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

baskılar

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

Şimdi, aşağıdaki gibi Koordinatlar sınıfında toString () geçersiz kılınarak,

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

sonuçlanır

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

Yöntem, bu nesnelere referanslar içeren koleksiyonlarda çağrıldığında, toString () öğesini geçersiz kılmanın faydası daha da artar. Örneğin, aşağıdaki

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

baskılar

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

bunun yerine,

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

Birkaç uygulama işaretçisi,

  1. Neredeyse her zaman toString () yöntemini geçersiz kılmalısınız. Geçersiz kılmanın gerekli olmadığı durumlardan biri, statik yardımcı program yöntemlerini java.util.Math biçiminde gruplayan yardımcı program sınıflarıdır . Geçersiz kılmanın gerekmemesi oldukça sezgiseldir; neredeyse her zaman bilirsiniz.
  2. Döndürülen dize kısa ve bilgilendirici, ideal olarak kendini açıklayıcı olmalıdır.
  3. En azından, iki farklı nesne arasında eşdeğerlik oluşturmak için kullanılan alanlar, yani equals () yöntemi uygulamasında kullanılan alanlar , toString () yöntemi tarafından tükenmelidir.
  4. Döndürülen dizede bulunan tüm örnek alanları için erişimciler / alıcılar sağlayın. Örneğin, Koordinatlar sınıfında,

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

ToString () yönteminin kapsamlı bir kapsamı kitabın 10. Maddesi olan Effective Java ™, Second Edition, Yazan Josh Bloch'da yer almaktadır.


6

Kodlama:

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

Çıktı:

[Steve 12 Daniel, Sachin 10 Tendulkar]

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

Pojo (Student.java) sınıfında toString () 'e alışkın değilseniz, [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]toString () yöntemini kullandığımız bu tür sorunlardan kaçınmak için.


4

Bir String bağlamında bir Nesneye (bir Dize olmayan) her eriştiğinizde, toString () derleyici tarafından kapakların altında çağrılır.

Bu nedenle

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

çalışır ve kendi sınıflarınızda Object'ten standart toString () öğesini geçersiz kılarak, nesnelerinizi String bağlamlarında da yararlı hale getirebilirsiniz.

(ve bunu bir kara kutu olarak kabul edin! İçeriği asla bir insana sunmaktan başka bir şey için kullanmayın)


3

Doğru bir şekilde geçersiz kılınan toString yöntemi, Java'nın günlüğe kaydedilmesine ve hata ayıklanmasına yardımcı olabilir.


2

Hata ayıklama ile ilgili olarak cletus'un yanıtladığı şeyden ayrı olarak, bir nesneyi çıkardığınızda, örneğin kullandığınızda kullanılır.

 System.out.println(myObject);

veya

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

1

ToString'in temel amacı, bir nesnenin String temsilini oluşturmaktır, yani dönüş değeri her zaman bir String'dir. Çoğu durumda bu basitçe nesnenin sınıfı ve paket adıdır, ancak StringBuilder gibi bazı durumlarda aslında bir String-metnine sahip olursunuz.


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

Önce Python sonra Java öğrenirseniz. Ben aynı rol oynar düşünüyorum __str__()Python yöntemle, bir olan sihirli yöntemi gibi __dict__()ve __init__()fakat nesneyi temsil eden bir dize başvurmak için.


-1

toString()bir dize değerine belirtilen nesneyi dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.