Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Excerpt

toString-metoden brukes for å lage String av et objekt, typisk til bruk for utskrift ved feilretting.

Det er altså ikke et poeng at returverdien fra toString() skal ta seg pent ut for en sluttbruker, men være informativ for programmereren.

toString()-metoden brukes implisitt når en spleiser sammen String-objekter med + og når en skriver ut et objekt, enten det er til java.io.OutputStream eller java.io.Writer. En kan også kalle toString() selv, men som oftest anbefales det å bruke den statisk metoden String.valueOf(Object), siden denne også virker om objekt-argumentet er null.

Eksisterende toString()-metoder

Metoden som er ferdigimplementert i Object og som brukes hvis du ikke lager en selv, vil gi deg en String som inneholder det fulle klassenavnet (altså med pakkenavnet) etterfulgt av en kode. Dette er nok til å skille objekter fra hverandre, men det sier ikke noe om innholdet i eller tilstanden til objektet. Når en lager en egen metode, så er nettopp det poenget: Å vise både typen og (den meste relevante delen av) innholdet/tilstanden.

De fleste standard Java-klasser har en egen toString()-metode, som gir en nyttig String. F.eks. vil alle java.util.Collection-objekter spleise sammen en String av alle elementene sin toString()-resultater med [ ] rundt.

Egendefinert toString()-metode

Ved å (re)definere toString() i egne klasser, gjør du feilfinning enklere, både for deg selv og andre som bruker klassen din. En mye brukt konvensjon for toString() er å lage en String bestående av klassenavnet etterfulgt av feltnavn og -verdi-par med [ ] rundt. Hvis en f.eks. har en Point-klasse for koordinat-par som inneholder feltene x og y, så vil den kunne ha følgende toString()-metode:

Code Block
	// langformen, f.eks. [Point x=10.0 y=3.14]
	public String toString() {
		return "[Point x=" + x + " y=" + y + "]";
	}

Dersom det for en klasse er rimelig opplagt hva feltnavnene er, så kan disse utelates, slik:

Code Block
	// mellomkompakt form, f.eks. [Point 10.0, 3.14]
	public String toString() {
		return "[Point " + x + ", " + y + "]";
	}

En annen mellomkompakt variant som kan brukes når det er lett å gjette klassen fra feltnavnene er å utelate klassenavnet og kun bruk feltnavn og -verdi-parene:

Code Block
	// mellomkompakt form, f.eks. [x=10.0 Y=3.14]
	public String toString() {
		return "[x=" + x + " y=" + y + "]";
	}

For små-objekter som Point, kan det også være greit å bruke en egen syntaks som utelater alt unntatt feltverdiene, såfremt resultat-String'en er gjenkjennbar:

Code Block
	// kompakt form, f.eks. (10.0, 3.14)
	public String toString() {
		return "(" + x + ", " + y + ")";
	}

Teknikken med å spleise sammen String'er med + er hendig, men en annen variant som ofte er mer lettlest er bruke av String.format(...)-metoden, som lar deg bruke en slags mal hvor verdier skytes inn. Istedenfor en lang kjede med uttrykk med + mellom, er første argumentet en String med %s der en vil skyte inn faktiske verdier, etterfulgt av de faktiske (felt)verdiene som argumenter. Den første varianten over kan skrives slik, med String.format:

Code Block
	// langformen, f.eks. [Point x=10.0 y=3.14]
	public String toString() {
		return String.format("[Point x=%s y=%s]", x, y); // x og y skytes inn i der %s'ene er
	}

%s er et såkalt formatteringsdirektiv, og det finnes mange varianter av disse for de ulike standard-typene, f.eks. %d for heltall og %e, %f og %g for ulike varianter av desimaltallsformattering. Se http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax for detaljer.