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 Object
klasie (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@2f92e0f4
można zatem wyjaśnić jako:
com.foo.MyType
- nazwa klasy, tzn. klasa znajduje się MyType
w 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.String
oznacza:
[
- 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 Person
klasy 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ę Person
obiektó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.