2009-02-19 7 views
10

Neben natürlich ihre Verwendung mit Primitiven. Die meisten (wenn nicht alle) der Implementierungen, die ich sehe, sind nur aus Sicht eines Programmierers nützlich.Ist toString() nur zum Debuggen von Nutzen?


EDIT: Ich verstehe, dass ich soll das Standardverhalten außer Kraft zu setzen, warum das ich Implementierungen erwähnt :). Und ich bekomme den Wert, es in einigen Komponenten zu überschreiben, die eine String-Repräsentation in einer GUI erfordern. Zumindest im JDK sehe ich jedoch viele von Implementierungen, die nur zum Einsatz kommen, wenn Sie die Objektinstanzen debuggen müssen.

Warum ist es in der Object-Klasse verwurzelt, da das nur für GUI/Debugging-Sachen nützlich zu sein scheint? Gibt es andere Verwendungen, die mir nicht bekannt sind?

+1

die Frage an mehrere Sprachen Targeting gebunden ist, auf den anerkannten Praktiken dieser Auszeichnungssprache unterschiedliche Ergebnisse zu erzielen. – Robin

Antwort

12

toString() ist nützlich, wenn Sie eine Zeichenfolgendarstellung eines Objekts wünschen. Dies geschieht natürlich zu Debugging-Zwecken, kann aber auch dazu dienen, Ergebnisse von Operationen an den Benutzer auszugeben.

Nehmen wir zum Beispiel an, Sie haben eine komplexe Klasse, die komplexe Zahlen handhabt.Wenn Sie sie in einem Format wie 3 + 2i an einen Benutzer ausgeben möchten, ist es praktisch, wenn sie toString() definieren, da Sie nicht jedes Mal das Format schreiben müssen und die Ausgabe konsistent ist. Wenn Sie diese Repräsentation jemals ändern möchten, zum Beispiel zu 3 + 2j, müssen Sie nur die toString() - Methode in der Complex-Klasse berühren.

So toString() ist nicht für Debugging-Zwecke auch, aber ist eine gute Möglichkeit, konsistente String-Darstellungen Ihrer Objekte zu erhalten.

+0

In der Tat, aber nein gibt es keine Garantie für diese "konsistente String-Repräsentation" überhaupt. –

+0

Ich habe eine FooFile-Klasse mit FooFileSections. Um die Datei zu schreiben, überschreibe ich einfach ToString für die Datei selbst: FooFile.ToString() sowie für jeden Dateiabschnitt: FooFileSections.ToString(). dann erstelle ich den Dateiinhalt, indem ich ToString in der richtigen Reihenfolge für die FooFileSections aufruft, dann streame einfach den Text aus. Wahrscheinlich kein guter Weg, aber schnell und einfach. –

+0

"Ausgabe von Ergebnissen von Operationen an den Benutzer". Da der 'toString()' Text nicht internationalisiert ist, ist fraglich, wie nützlich der Text für den Benutzer im Allgemeinen ist. – Raedwald

17

Nein, der Schlüssel ist, dass Sie die Standardimplementierung von ToString() überschreiben sollten, um es nützlich zu machen. ToString() kann eine gute Möglichkeit sein, den Wert von etwas zurück auf die Benutzeroberfläche auszugeben.

Ein einfaches Beispiel wäre, wenn Sie eine Name-Klasse mit drei Strings (First, Middle, Last) haben. Sie können eine ToString()-Methode verwenden, die es für die Benutzeroberfläche formatiert: "Last, First Middle" zum Beispiel.

Oder eine Klasse, die eine mathematische Operation speichert (Werte Left = 2, Right = 3, Result = 6 und ein Operator enum = Multiply). Rufen Sie ToString() an, um "2 * 3 = 6" zu erhalten.

jedoch, ist es wahrscheinlich häufiger eine Vielzahl von verschiedenen To<qualifier>String() Methoden zu haben, wie die .NET DateTime Klasse. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Edit: Was, warum es bei der Object Klasse verwurzelt ist, ist es einfach, weil ToString() für etwas ein gültiger Betrieb ist.

Darüber hinaus können Zeichenfolgen eine gute Möglichkeit zum Marshalling zwischen Datentypen oder Datenkonsumenten darstellen, da sie (praktisch) garantiert parsenbar sind und keine zusätzliche Codierung oder Pflege erfordern.

+0

Sehr vollständige Follow-up. Ich denke nur, dass das GUI-Labeling für toString() überstrapaziert wird. Warum nicht etwas wie 'implementiert Interface TextRepresentation' oder etwas ähnliches? –

+0

Ich stimme zu, es ist eine gültige Operation für alles, aber nur vom Standpunkt des Programmierers. Mein Punkt ist, dass es keinen Vertrag gibt, um anzugeben, dass die Methode GUI-freundliche Zeichenketten zur Verfügung stellen oder die spezifischen Interna der Instanz (Felder), die nur für Programmierer, IMHO –

+3

oft schlecht für UI-Zwecke, wie es verfügbar sind nimmt kein Benutzergebietsschema an. Egal für das Debugging, spielt für die Endbenutzer eine Rolle. – MSalters

0

ToString() wird vom .NET Framework auch implizit aufgerufen, wenn ein Objekt in eine Zeichenfolge ausgegeben wird.

Console.WriteLine("My Object is" + object.ToString()); 

entspricht

Console.WriteLine("My Object is" + object); 

weil die toString() implizit aufgerufen wird.

Ich glaube, obwohl ich nicht sicher bin, dass es vom Debugger für den "Wert" eines Objekts verwendet wird. Dies kann ziemlich praktisch sein, wenn auch begrenzt. In den meisten Fällen wäre es besser, einen eigenen Debugger-Visualizer zu schreiben.

+0

Der Debugger möglicherweise ToString() für einige Objekte aber nicht alle aufrufen, wie von List wo die Debugger-Ausgabe ist viel nützlicher als die Ausgabe von ToString(). – jwg

0

Auf AS3 musste ich ein 2D-Array in ein 1D-Array konvertieren. Die schnellste (Laufgeschwindigkeit) und einfachste (Codierung Zeit) Lösung war:

var new1DArray:Array = the2DArray.toString().split(","); 

überrascht sein, aber es funktioniert tatsächlich wie beabsichtigt und recht schnell, auch!

1

Nützlich für

  1. Gui (komplexe Eigenschaft, wenn Sie Property verwenden, Formularkopftext)
  2. Databinding (das ist die Art und Weise, wie es funktioniert)

Und andere Zeichenfolge ausgegeben.

-1

es vielleicht nicht die „intented“ Einsatz sein, aber ich habe es für Datenserialisierung verwendet

storeToHardDrive(studentList.ToString()); 
13

Meine persönliche Präferenz ist, dass toString() sollte nie andere für alles verwendet werden als das Debuggen. Wenn Sie eine Zeichenfolge für ein Objekt erstellen möchten, stellen Sie eine separate Methode bereit, die Ihre Absicht eindeutig dokumentiert (getName(), getDescription() usw.). Verlassen Sie sich nie auf die Implementierung einer toString().

Das Problem ist, dass viele Entwickler toString() als Debug-Ebene Zeichenfolge sehen und nichts davon zu ändern (sagen, wenn neue Felder hinzugefügt oder entfernt werden). Heck, einige automatisierte ToString() - Builder verwenden Reflektion, um aus den Feldern eine toString() zu generieren.

Ich habe gefunden, dass diese Präferenz mir im Laufe der Jahre gut gedient hat.

+0

Gegeben, dass der String das nützlichste Konstrukt in der Programmierung ist, kann es sehr mächtig sein zu wissen, dass jedes Objekt in Ihrem Programmraum einen Vertrag erfüllt, um eine String-Repräsentation von sich selbst zu liefern. Wie bei allem Mächtigen kann es missbraucht werden, aber es ist eine Verschwendung, es zu vermeiden. –

+1

Aber vorausgesetzt, dass der Vertrag a) garantiert nichts über das Format der Zeichenfolge und b) bietet keine symmetrische API, um von String zurück zu dem Objekt zu konvertieren, finde ich, dass es ein schwacher Arsch Vertrag ist. Ich habe viele Probleme gelöst, die sich auf die Annahme eines nicht existierenden "Vertrags" für toString beziehen. –

+0

Ich habe genau die gleiche Ansicht. Ich denke, die GUI-Label-Textrepräsentation stopft gerade die Methode über. –

0

Abgesehen von dem, was alle anderen schon gesagt hat, ToString überschreiben() ist auch nützlich, wenn Kontrollen verwenden, die es nennen. Zum Beispiel kann ein ComboBox:

myComboBox.Items.Add(new MyClass()); 
// now, whatever ToString() returns is shown in the 
// ComboBox, but you can get the object back by through 
// the SlectedItem property. 
6

Alles, was ich sagen kann, ist, dass ich Code Pause gehabt habe, wenn ich das toString meiner Klasse geändert einige zusätzliche Debug-Informationen angezeigt werden.

Der Code in Frage war eine GUI-Bibliothek, die den Wert von toString als einige interne Sache (es war vor ein paar Jahren ... Ich habe vergessen, was es genau war). Das Endergebnis war, dass ich diese Bibliothek nicht mehr benutzte.

Ich würde sagen, dass, da eine große Gruppe von Menschen toString als zum Debuggen verwendet (unabhängig von Ihrer Meinung von dem, wofür es gedacht ist) verwendet wird, dass es problematisch ist, den von ihm zurückgegebenen Wert zu verwenden Programmatisch zu machen (wie es zu analysieren) oder es einem Benutzer anzuzeigen.

Wenn Sie 100% Kontrolle über die toString-Methoden haben, dann tun Sie auf alle Fälle, was Sie wollen.

Also, um die Frage zu beantworten, ist kein toString nicht nur nützlich für das Debuggen, Sie können alles tun, was Sie damit wollen. Seien Sie jedoch nicht überrascht, wenn sich toString so verändert, dass Sie unglücklich sind.

+2

Alles was ich sagen kann, dass es jenseits von Debugging eine sehr, sehr undichte Abstraktion ist :) –

2

Zuerst sollte die -Methode eine von Menschen lesbare textuelle Darstellung des Objekts zurückgeben.

Dieses Problem tritt auf in Effective Java als . Element 10: Überschreiben Sie immer.

Es verweist auf die Java API Specification für die Object.toString Methode:

Das Ergebnis ist eine präzise sein sollte, aber informative Darstellung, die einfach für eine Person zu lesen.

Abgesehen von Debugging kann die toString Methode einer Klasse überschreiben nützlich sein, wenn Objekte in eine JList oder ein JTable ading, die standardmäßig die toString Methode das Objekt als Textform in der Liste angezeigt werden oder Tabelle. In meinem Fall habe ich die toString-Methode von Objekten überschrieben, die zu einer JList hinzugefügt werden, so dass der Benutzer Informationen über das Element in einer Liste über die GUI anzeigen kann.

So gibt es tatsächlich Fälle, in denen die -Methode für andere Fälle als das Debuggen nützlich ist. Der Schlüssel ist, dass die toString Methode Informationen zurückgibt, die für eine Person tatsächlich nützlich sind, um sie zu sehen, nicht die Standardimplementierung Object.toString, in der der Speicherort des Objekts für seine textuelle Darstellung verwendet wird.

4

Meiner Erfahrung nach hat toString() außerhalb des Debuggens und der Protokollierung wenig Wert. Sie können sich im Laufe der Zeit nicht auf das Format oder den Inhalt verlassen, so dass Sie nicht nur für Menschen lesbar sind, sondern für nichts anderes als die einfachsten Objekte (wie die primitiven Objekttypen). Wenn mehrere Datenelemente vorhanden sind, erwarten Sie, dass sie sich im Laufe der Zeit im Typ oder in der Anzahl ändern, und die Ausgabe von toString() zusammen mit dem Datenelement.

Ein weiterer Punkt möchte ich stark machen. Rufen Sie in toString() keine anderen Methoden auf. Nichts Schlimmeres, als den Variableninhalt an einem Haltepunkt im Debugger zu prüfen und dann aufgrund von Methodenaufrufen in toString() mehr Code ausführen zu lassen.

3

Ich denke, es ist wichtig, die Leute zu erwähnen, die mit "toString" antworten, beachten Sie, dass die Kleinbuchstaben "t" im Allgemeinen über Java sprechen, und die Leute, die mit "ToString" antworten, beziehen sich im Allgemeinen auf C#. Dies gilt natürlich nicht für alle Antworten.

In meiner eigenen Beobachtung (ich benutze beide täglich), Programmierer in C# sind aufgefordert, "ToString" überschreiben, um eine nützliche textliche Darstellung anzuzeigen. Während ich in Java das nicht annähernd so sehe. Tatsächlich sehe ich das selten.

-JP

Verwandte Themen