tło
Wszystkie obiekty Java mają toString()metodę, która jest wywoływana podczas próby wydrukowania obiektu.
System.out.println(myObject); // invokes myObject.toString()
Ta metoda jest zdefiniowana w Objectklasie (nadklasie wszystkich obiektów Java). Object.toString()Metoda zwraca dość brzydki patrząc ciąg, składający się z nazwą klasy, a @symbolem i hashcode obiektu w systemie szesnastkowym. Kod tego wygląda następująco:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Wynik taki com.foo.MyType@2f92e0f4można zatem wyjaśnić jako:
com.foo.MyType - nazwa klasy, tzn. klasa znajduje się MyTypew paczce com.foo.
@ - łączy ciąg razem
2f92e0f4 kod skrótu obiektu.
Nazwy klas tablic wyglądają nieco inaczej, co zostało dobrze wyjaśnione w Javadocs dla Class.getName(). Na przykład [Ljava.lang.Stringoznacza:
[- W jednowymiarowe tablica (w przeciwieństwie do [[lub [[[itd.)
L - tablica zawiera klasę lub interfejs
java.lang.String - rodzaj obiektów w tablicy
Dostosowywanie danych wyjściowych
Aby wydrukować coś innego, kiedy zadzwonić System.out.println(myObject), należy zastąpić ten toString()sposób w swojej własnej klasie. Oto prosty przykład:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Teraz, jeśli wydrukujemy a Person, zobaczymy raczej ich nazwę com.foo.Person@12345678.
Pamiętaj, że toString()jest to tylko jeden sposób konwersji obiektu na ciąg. Zazwyczaj dane wyjściowe powinny w pełni opisywać obiekt w jasny i zwięzły sposób. Lepszym toString()dla naszej Personklasy może być:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Który wydrukowałby np Person[name=Henry]. To naprawdę przydatny kawałek danych do debugowania / testowania.
Jeśli chcesz skupić się tylko na jednym aspekcie swojego obiektu lub zastosować wiele jazzy formatowania, lepiej zamiast tego zdefiniować oddzielną metodę, np String toElegantReport() {...}.
Automatyczne generowanie wyniku
Wiele IDE oferuje obsługę automatycznego generowania toString()metody na podstawie pól w klasie. Zobacz na przykład dokumenty dotyczące Eclipse i IntelliJ .
Kilka popularnych bibliotek Java również oferuje tę funkcję. Niektóre przykłady obejmują:
Drukowanie grup obiektów
Więc stworzyłeś fajny toString()dla swojej klasy. Co się stanie, jeśli ta klasa zostanie umieszczona w tablicy lub kolekcji?
Tablice
Jeśli masz tablicę obiektów, możesz wywołać, Arrays.toString()aby uzyskać prostą reprezentację zawartości tablicy. Weźmy na przykład tę tablicę Personobiektów:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Uwaga: jest to wywołanie metody statycznej wywoływanej toString()w klasie Arrays, która różni się od omawianej powyżej.
Jeśli masz tablicę wielowymiarową , możesz użyć Arrays.deepToString()tej samej wartości wyjściowej.
Kolekcje
Większość kolekcji będzie generować niezłe wyniki oparte na wywołaniu .toString()każdego elementu.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Musisz tylko upewnić się, że elementy listy definiują ładne, toString()jak omówiono powyżej.