Mam klasę zdefiniowaną w następujący sposób:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Próbowałem wydrukować instancję mojej klasy:
System.out.println(myPerson);
ale mam następujący wynik: com.foo.Person@2f92e0f4
.
Podobnie stało się, gdy próbowałem wydrukować tablicę Person
obiektów:
Person[] people = //...
System.out.println(people);
Mam wynik: [Lcom.foo.Person;@28a418fc
Co oznacza ten wynik? Jak zmienić to wyjście, aby zawierało nazwisko mojej osoby? Jak wydrukować kolekcje moich obiektów?
Uwaga : ma to na celu kanoniczne pytania i odpowiedzi na ten temat.
Odpowiedzi:
tło
Wszystkie obiekty Java mają
toString()
metodę, która jest wywoływana podczas próby wydrukowania obiektu.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:Wynik taki
com.foo.MyType@2f92e0f4
można zatem wyjaśnić jako:com.foo.MyType
- nazwa klasy, tzn. klasa znajduje sięMyType
w paczcecom.foo
.@
- łączy ciąg razem2f92e0f4
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 interfejsjava.lang.String
- rodzaj obiektów w tablicyDostosowywanie danych wyjściowych
Aby wydrukować coś innego, kiedy zadzwonić
System.out.println(myObject)
, należy zastąpić tentoString()
sposób w swojej własnej klasie. Oto prosty przykład: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. LepszymtoString()
dla naszejPerson
klasy może być: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ą:
ToStringBuilder
z Apache Commons LangMoreObjects.ToStringHelper
z Google Guava@ToString
adnotacja z projektu LombokDrukowanie 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: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.Musisz tylko upewnić się, że elementy listy definiują ładne,
toString()
jak omówiono powyżej.źródło
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
i naprawdę zamiastname
tego powinien używać getteragetName()
(ale gettery zostały pominięte w klasie Person ...), ale jeśli użyty został getter ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
więc możesz używać go również do tablic prymitywów (int[]
,double[]
).Arrays.deepToString()
Ładnie obsługuje również wielowymiarowe tablice prymitywów.Myślę, że apache zapewnia lepszą klasę wykorzystania, która zapewnia funkcję pobierania łańcucha
źródło
Każda klasa w Javie ma
toString()
w sobie domyślnie metodę, która jest wywoływana, jeśli przekażesz jakiś obiekt tej klasySystem.out.println()
. Domyślnie to wywołanie zwraca nazwę klasy @ kod skrótu tego obiektu.Możesz przesłonić metodę toString klasy, aby uzyskać inne dane wyjściowe. Zobacz ten przykład
źródło
[Lcom.foo.Person;@28a418fc
jako wynik: to także wyniktoString()
metody, ale tej, która jest zaimplementowana w klasie generowanej w czasie wykonywania dla typuPerson[]
, a niePerson
(patrz stackoverflow.com/a/8546532/1542343 ).W Eclipse przejdź do swojej klasy, kliknij prawym przyciskiem myszy-> źródło-> Generuj
toString()
;Zastąpi
toString()
metodę i wydrukuje obiekt tej klasy.źródło
Wolę używać funkcji narzędzia, która używa GSON do przekształcenia obiektu Java w postać szeregową w ciąg JSON.
źródło
return Gson.toJson(object);
, w przeciwnym razie działa idealnie.W intellij możesz automatycznie wygenerować metodę toString, naciskając alt + wstawkę, a następnie wybierając toString () tutaj jest wyjście dla klasy testowej:
Jak widać, generuje ciąg poprzez połączenie kilku atrybutów klasy, dla prymitywów wypisze ich wartości, a dla typów referencyjnych użyje ich typu klasy (w tym przypadku do metody łańcuchowej Test2).
źródło
Domyślnie każdy obiekt w Javie ma
toString()
metodę, która generuje ObjectType @ HashCode.Jeśli chcesz uzyskać więcej przydatnych informacji, musisz zastąpić
toString()
metodę w swojej klasie.Teraz, gdy drukujesz obiekt osoby, używając
System.out.prtinln(personObj);
go, wydrukuje nazwisko osoby zamiast nazwy klasy i kodu skrótu.W drugim przypadku, gdy próbujesz wydrukować tablicę, wypisuje
[Lcom.foo.Person;@28a418fc
ona typ tablicy i kod skrótu.Jeśli chcesz wydrukować nazwiska osób, istnieje wiele sposobów.
Możesz napisać własną funkcję, która iteruje każdą osobę i drukuje
Możesz go wydrukować za pomocą Arrays.toString (). Wydaje mi się to najprostsze.
Możesz wydrukować java 8 sposób (używając strumieni i referencji metod).
Mogą być też inne sposoby. Mam nadzieję że to pomoże. :)
źródło
Jeśli wydrukujesz bezpośrednio dowolny obiekt Osoby, będzie
ClassName@HashCode
to zgodne z Kodeksem.w twoim przypadku
com.foo.Person@2f92e0f4
jest drukowane. GdziePerson
jest klasa, do której należy obiekt i2f92e0f4
jest hashCode obiektu.Teraz, jeśli spróbujesz użyć obiektu
Person
, wydrukuje nazwęźródło
Jeśli spojrzysz na klasę Object (klasa macierzysta wszystkich klas w Javie), implementacja metody toString () jest
za każdym razem, gdy drukujesz dowolny obiekt w Javie, wywoływana jest funkcja toString (). Teraz to od Ciebie zależy, czy przesłonisz metodę toString (), a następnie twoja metoda wywoła inne wywołanie metody klasy Object.
źródło