Metoda toString() to standardowa metoda klasy Object w Javie, która pozwala uzyskać tekstową reprezentację obiektu. Historycznie została wprowadzona, aby wspomagać debugowanie i logowanie, aby zamiast wywołania technicznych informacji o obiekcie (ClassName@hashCode) można było uzyskać treściwy, czytelny opis.
Początkowo, jeśli nie nadpisywać toString(), metoda zwracała ciąg w formacie nazwa_klasy@hashCode. To jest niewygodne do zrozumienia lub wyświetlania stanu obiektu. Dlatego nadpisywanie toString() stało się dobrą praktyką.
Bez wyraźnej realizacji toString(), debugowanie i logowanie obiektów staje się trudniejsze. Trudno zrozumieć, co dokładnie znajduje się w obiekcie, nie znając jego wewnętrznej struktury lub bieżących wartości pól.
Prawidłowe nadpisanie toString() pozwala:
Przykład kodu:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
Kluczowe cechy:
Czy zawsze trzeba nadpisywać metodę toString() we wszystkich klasach?
Nie, nie jest to konieczne, ale zdecydowanie zaleca się jej nadpisywanie w klasach, obiekty których często są wyświetlane w logach lub używane do debugowania.
Czy metoda toString() może rzucać wyjątki?
Technicznie tak, jeśli wewnątrz metody wystąpi na przykład NullPointerException podczas dostępu do pola, nie sprawdzając na null. Ale dobrą praktyką jest unikanie tego, aby toString() zawsze zwracało poprawny ciąg.
Czy wywołanie toString() jest obowiązkowe jawnie?
Nie, kompilator wywołuje ją niejawnie podczas konkatenacji obiektu z ciągiem lub podczas wyświetlania obiektu przez System.out.println.
Person p = new Person("Ivan", 25); System.out.println(p); // Automatycznie wywoła p.toString()
Programista nie nadpisuje toString() w klasie User i pisze w logu:
log.info(user);
Zalety:
Wady:
User@1a2b3c, brak informacji o użytkowniku.Programista nadpisuje toString():
@Override public String toString() { return "User{name='" + name + "', id=" + id + "}"; }
Zalety:
Wady: