Як використовувати метод toString на Java?


118

Чи може хтось пояснити мені поняття toString()методу, визначене на Objectуроці? Як він використовується та яка його мета?



ось також швидкий трюк / швидка реалізація: @Override public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (це); }
granadaCoder

Відповіді:


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
Основна мета - переосмислити його в підкласах. Я думаю, що відповіді від @stephen та Andreas_D краще, ніж прийнята відповідь.
Sree Rama

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
Сподіваюся, вам відомо, що toStringце не призначено і не підходить для цілей інтерфейсу.
Powerslave

@Powerslave потім поясніть, чому всі компоненти Swing використовують toStringдля відображення об'єкта в графічному інтерфейсі? Якщо у мене є багатий об'єкт і я хочу його показати в графічному інтерфейсі, то ні, я не створюю для нього додаткового рендерінгу, а також не витягую з нього об'єктну властивість для використання в GUI, я зберігаю його простий і реалізований, toStringщоб мати можливість обійти все, що над головою. Якщо ви хочете зробити це більш чистим способом, створіть клас обгортки, який призначений для цілей інтерфейсу, та реалізує його toStringметод для повернення рядкового властивості wrappee.
Тиммос

1
@Timmos Якби ваші друзі зіскочили з мосту, ви б пішли за ним? Тільки тому, що розробники Swing використовують (читають; зловживають) функцію toString - це не означає, що ви теж не повинні.
Toby Caulk

2
Це, безумовно, найпростіший підхід до виконання роботи, якщо ви продовжуєте використовувати API Swing за замовчуванням. Якщо ви хочете користувальницьку візуалізацію, добре, встановіть на свій компонент спеціальний візуалізатор. Якщо ви просто хочете відобразити об’єкт, представлений String, то реалізація toString () набагато простіше порівняно зі спеціальним рендерінгом, у якого є всі види неполадок, щоб зробити це правильно. Я думаю, що ваше порівняння зі стрибком з моста дивне.
Тиммос

35

toString()Метод повертає текстове представлення об'єкта. Базова реалізація вже включена, java.lang.Objectі тому, що всі об'єкти успадковуються від java.lang.Objectнеї, гарантується, що кожен об’єкт у Java має цей метод.

Перевизначення методу - це завжди хороша ідея, особливо якщо мова йде про налагодження, тому що налагоджувачі часто показують об'єкти за результатом toString()методу. Тому використовуйте змістовну реалізацію, але використовуйте її в технічних цілях. Логіка програми повинна використовувати getters:

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

Можливо, він може мати використання в контексті програми, але набагато частіше він використовується для налагодження. Наприклад, коли ви потрапляєте в IDE, точку прориву набагато простіше читати значущі toString()об'єкти, ніж перевіряти їх членів.

Немає встановленої вимоги щодо того, що toString()повинен робити метод. За умовою, найчастіше він розповість вам назву класу та значення відповідних членів даних. Найчастіше toString()методи автоматично створюються в IDE.

Покладатися на певний вихід із toString()методу або аналізувати його в межах програми - погана ідея. Що б ви не робили, не йдіть цим маршрутом.


2
Ви могли б детальніше розповісти про своє останнє твердження?
Жан-Філіппе Каруана

13

toString () повертає рядкове / текстове подання об'єкта. Зазвичай використовується для діагностичних цілей, таких як налагодження, ведення журналів тощо. Метод toString () використовується для читання змістовних подробиць про об'єкт.

Він автоматично викликається, коли об'єкт передається println, print, printf, String.format (), assert або оператору конкатенації рядків.

Реалізація за замовчуванням toString () у класі Object повертає рядок, що складається з імені класу цього об'єкта з подальшим знаком @ та непідписаним шістнадцятковим поданням хеш-коду цього об’єкта за допомогою наступної логіки,

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

Тепер, переосмисливши ToString () в класі Координати, як показано нижче,

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

призводить до

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

Корисність переосмислення toString () стає ще більшою, коли метод викликається у колекціях, що містять посилання на ці об'єкти. Наприклад, наступне

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 (). Одним із випадків, коли переоцінка не потрібна, є класи утиліти, які групують статичні корисні методи, таким чином, як java.util.Math . Випадок відмови не вимагається досить інтуїтивно; майже завжди ви б знали.
  2. Рядок, що повертається, повинен бути стислим та інформативним, в ідеалі - сам поясненням.
  3. Принаймні, поля, які використовуються для встановлення еквівалентності між двома різними об'єктами, тобто поля, що використовуються в реалізації методу equals (), повинні бути виплюнені методом toString ().
  4. Укажіть accessors / getters для всіх полів екземпляра, які містяться у повернутому рядку. Наприклад, у класі Координати,

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

Всебічне висвітлення методу toString () міститься в пункті 10 книги «Ефективна Java ™, друге видання» Джоша Блоха.


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 Бхаджи]

Якщо ви не звикли до toString () у класі Pojo (Student.java), ви отримаєте такий вихід, як. [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]Щоб уникнути подібних проблем, ми використовуємо метод toString ().


4

Кожного разу, коли ви отримуєте доступ до об'єкта (не є String) у String-контексті, компілятор викликає toString () під обкладинками.

Ось чому

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

працює, і замінивши стандартний toString () від Object у власних класах, ви також можете зробити свої об’єкти корисними і в String-контекстах.

(і вважайте це чорною скринькою! Ніколи, ніколи не використовуйте вміст ні для чого іншого, ніж представляти людині)


3

Правильно перекритий метод toString може допомогти в реєстрації та налагодженні Java.


2

Окрім того, що відповів клетус щодо налагодження, він використовується щоразу, коли виводите об'єкт, як, наприклад, під час використання

 System.out.println(myObject);

або

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

1

Основна мета toString - генерувати String-представлення об'єкта, тобто повернене значення завжди є String. У більшості випадків це просто клас об'єкта та назва пакету, але в деяких випадках, як StringBuilder, ви отримаєте фактично 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

Якщо ви вивчите спочатку Python, а потім Java. Я думаю, він відіграє таку ж роль, що і __str__()метод в Python, це магічний метод, як __dict__()і, __init__()але для посилання на рядок, що представляє об'єкт.


-1

toString()перетворює вказаний об'єкт в строкове значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.