Hvad er [Ljava.lang.Object;?
1. Oversigt
I denne øvelse lærer vi hvad [Ljava.lang.Object midler og hvordan man får adgang til de korrekte værdier for objektet.
2. Java-objektklasse
I Java, hvis vi ønsker at udskrive en værdi direkte fra et objekt, er det første, vi kan prøve at kalde dets toString metode:
Object[] arrayOfObjects = { "John", 2, true };
assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));
Hvis vi kører testen, vil den lykkes, men normalt er det ikke et særlig brugbart resultat.
Det, vi vil gøre, er at udskrive værdierne inde i arrayet. I stedet har vi [Ljava.lang.Object. Navnet på klassen, som implementeret i Object.class :
getClass().getName() + '@' + Integer.toHexString(hashCode())
Når vi får klassenavnet direkte fra objektet, får vi de interne navne fra JVM med deres typer, det er derfor, vi har ekstra tegn som [ og L , repræsenterer de henholdsvis Array- og ClassName-typerne.
3. Udskrivning af meningsfulde værdier
For at kunne udskrive resultatet korrekt, kan vi bruge nogle klasser fra java.util pakke.
3.1. Arrays
For eksempel kan vi bruge to af metoderne i Arrays klasse til at håndtere konverteringen.
Med endimensionelle arrays kan vi bruge toString metode:
Object[] arrayOfObjects = { "John", 2, true };
assertEquals(Arrays.toString(arrayOfObjects), "[John, 2, true]");
For dybere arrays har vi deepToString metode:
Object[] innerArray = { "We", "Are", "Inside" };
Object[] arrayOfObjects = { "John", 2, innerArray };
assertEquals(Arrays.deepToString(arrayOfObjects), "[John, 2, [We, Are, Inside]]");
3.2. Streaming
En af de væsentlige nye funktioner i JDK 8 er introduktionen af Java-streams , som indeholder klasser til behandling af sekvenser af elementer:
Object[] arrayOfObjects = { "John", 2, true };
List<String> listOfString = Stream.of(arrayOfObjects)
.map(Object::toString)
.collect(Collectors.toList());
assertEquals(listOfString.toString(), "[John, 2, true]");
For det første har vi oprettet en strøm ved hjælp af hjælpemetoden af. Vi har konverteret alle objekterne inde i arrayet til en streng ved hjælp af map, så har vi indsat det på en liste ved hjælp af collect for at udskrive værdierne.
4. Konklusion
I denne øvelse har vi set, hvordan vi kan udskrive meningsfuld information fra et array og undgå standarden [Ljava.lang.Object;.
Vi kan altid finde kildekoden til denne artikel på GitHub.