Wann ist der gewünschte nicht implementiert toString() in Java?
Einen lead developer auf mein Projekt genommen hat, unter Bezugnahme auf das Projekt toString () - Implementierungen als "reiner cruft" und ist auf der Suche, um Sie zu entfernen aus der code-Basis.
Ich habe gesagt, dass dies würde bedeuten, dass alle Kunden wollen, um die Objekte anzuzeigen, die würde haben, zu schreiben Ihren eigenen code zu konvertieren das Objekt string, das war aber antwortete mit "ja wäre Sie".
Nun konkret, die Objekte in diesem system sind grafische Elemente wie Rechtecke, Kreise, etc. und die aktuelle Darstellung ist die Anzeige x, y, Maßstab, Grenzen, usw...
Also, wo die Masse liegen?
Wann sollte und Wann sollte nicht implementieren Sie toString?
- Wow, ich hatte erwartet, mehr argument.
- Scheint, wie es ist, einen Konsens für das halten Sie in. Ich Frage mich, was ist die motivation hinter Ihrem lead-Entwickler wollen, um Sie zu entfernen? Leistung? Wartung? Refactoring-Probleme? Wenn wir verstehen, seine motivation besser, das würde wahrscheinlich dazu führen, ein besseres argument.
- ich denke, best-practices ist der Grund, es hat schlechte performance als best-practice.
- Ihre Führung ist der Wahnsinn. Wenn dies ein Spiegelbild Ihrer lead-typischen denken, sollten Sie überlegen, auf der Suche nach einem anderen job...
- Hmm... wie kam dieser Kerl zu bekommen, um ein "führen"? Er muss gefeuert werden... oder Sie brauchen einen neuen job zu finden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Welchen Schaden machen Sie? Warum entfernen Sie Sie, wenn Sie Sie haben? Ich finde toString () - extrem nützlich, wenn emitting debugging-Anweisungen.
Persönlich würde ich immer eher auf der Seite haben, eine praktikable Methode toString (). So wenig Arbeit zu schreiben.
Entfernen von gut-geschrieben (oder auch nur halbwegs anständig geschrieben) toString () - Methoden ist der pure Wahnsinn, IMO. Ja, ich bin oft zu faul, zu schreiben (wie oft die Objekte nicht am Ende mit Ihnen überhaupt benutzt), aber Sie sind äußerst praktisch, um zu haben.
Ich kann wirklich nicht glauben, einen guten Grund zu wollen, um loszuwerden, diese.
Habe ich immer darauf geachtet, dass meine Klassen implementiert toString.
Es bietet eine einfache Möglichkeit des Debuggens den aktuellen Zustand der Klasse, wenn ich Debuggen und wenn ich die Protokollierung Fehler, ich kann ihn in meine log-Meldungen.
Ich würde halten Sie die
toString()
Implementierungen. Sie sind von unschätzbarem Wert, wenn es zu Debuggen, und Sie können bei guter alt-text für grafische Komponenten sind.Ich würde behaupten das Gegenteil, dass toString() sollte überschrieben werden, überlegt. Die default-toString () - Implementierung ist sehr sinnlose und im Grunde nutzlos. Eine gute toString () - Implementierung geben kann ein Entwickler ein sehr nützliches Blick auf den Inhalt des Objekts auf einen Blick. Sie haben vielleicht nicht alles, aber zumindest die wichtigen Sachen. Ich denke, dass Ihr lead-Entwickler sollten eigentlich die Codierung und das hinzufügen von Funktionen, anstatt sich Gedanken über "cruft".
Würde ich nur dann umsetzen, ist es für komplexere Objekte, die in dem client-code kümmert sich nicht um die feinkörnigen details der Objekt-Staat, sondern die Pflege über einige mehr menschlich verständlich, Sinn machen Nachricht, dass fasst zusammen, was ist Los, state wise...
Für alles andere, wie JavaBeans, würde ich erwarten, dass der client-code zu werfen, mein Objekt in eine ToStringBuilder Methode oder ähnlich, wenn es benötigt zu tun, low-level-debugging.
Oder client-code sollte einfach anrufen, standard-Eigenschaft Getter und melden die Art, wie Sie wie...
Im Allgemeinen
toString()
ist gutes Zeug. Insbesondere ist es sehr nützlich für das Debuggen.Umsetzung
toString()
ist nicht ohne Kosten und Risiken. Wie alle code,toString()
- Implementierungen müssen gepflegt werden mit dem rest des Codes. Dies bedeutet, FührungtoString()
im sync mit Klasse Felder. Zum Beispiel, wenn ein Feld Hinzugefügt oder entfernt wird,toString()
sollten angemessen aktualisiert werden (Sie sollten tun dies bereits für die Methoden, wiehashCode()
undequals()
).Umsetzung
toString()
entstehen Risiken als gut. Zum Beispiel, angenommen, dass zwei Klassen in das system von Referenzen auf Instanzen der anderen (a bi-directional link), dann eine AnrufungtoString()
könnte zu einem stack-überlauf aufgrund ankten Rekursion alstoString()
Umsetzung in den einzelnen Klassen ruft dastoString()
Umsetzung der anderen Klasse.Wenn Ihr system eine große Anzahl von out-of-sync
toString()
Methoden, oder Methoden, die verursachen bugs wie stack-überlauf, dann wird Ihr Kollege könnte haben, eine angemessene Stelle. Auch in diesem Fall, würde ich einfach kommentieren buggytoString()
Methoden und lassen Sie Sie in den code. JedertoString()
Methode könnte auskommentiert werden, und aktualisiert nach Bedarf einzeln in der Zukunft.Ich immer auto-generate toString () - Methoden für alle meine
POJO
sDTO
s und/oder jedes Objekt, das enthält persistente Daten. Für private interne Eigenschaften gute logging-Praxis sollte den trick tun.Immer daran denken zu ersetzen, die in den toString-Methoden, Passwörter und andere sesitive info mit
[Omitted]
(oder etwas ähnliches von oben absondern, Natur)Gut, er hat stramge Sache.
Kann ich nicht sagen, toString() ist auch hilfreich. Für die Präsentation benötigen Sie andere Werkzeuge.
Aber toString() ist sehr nützlich für das Debuggen, denn man konnte sehen, den Inhalt der Sammlungen.
Verstehe ich nicht, warum entfernen Sie es, wenn es schon geschrieben
Ich denke, die Antwort hängt davon ab, wie kompliziert Ihre toString () - Methoden sind, wie viel Arbeit Sie benötigen, um zu halten und wie oft Sie gewöhnen. Vorausgesetzt, man toString() verwenden, die oft für logging-und debugging-es macht nicht viel Sinn, diese zu entfernen, Methoden. Aber wenn Sie nur selten verwendet werden und erfordern eine Menge Arbeit zu pflegen, jedes mal, wenn etwas änderungen in Ihrem code, dann vielleicht ist es ein gültiges argument, loszuwerden, einige oder alle der toString () - Methoden.
Erwähnt Sie etwas über Kunden benötigen, um diese Objekte anzuzeigen. Von diesem ich vermute, dein code ist oder enthält irgendeine Art von Bibliothek oder eine API, mit der andere Entwickler verwenden. In diesem Fall empfehle ich Ihnen zu pflegen, sinnvoll toString () - Implementierungen. Auch wenn Sie das nicht tun eine Menge von Protokollierung und debugging, Ihre Kunden könnten und Sie werden auf jeden Fall schätzen, nützlich toString () - Methoden, die Sie nicht haben, um schreiben und verwalten sich selbst.
+1 Mike C
Über seine Nützlichkeit für das Debuggen, wird die toString() ist ein unschätzbares Werkzeug zu verstehen, die Klasse Autor die Perspektive der Instanz.
FWIW, wenn die Ausgabe der toString-Methode unterscheidet sich von dem, was Sie erwarten, zu sehen (mit freundlicher Genehmigung spec docs) wissen Sie umgehend ging etwas ernsthaft falsch.
Persönlich, ich umsetzen, wenn ich gehe, um Objekte in einer JList, JTable, oder eine andere Struktur, die verwendet toString() ODER wenn ich Debuggen (ja, eclipse-debug-Formatierer aber toString() ist einfacher).
Vielleicht kann man das Feuer zurück, dass viele JDK-Klassen haben toString(). Sollten Sie auch entfernt werden? 😉
Ich würde sagen, Sie implementieren sollten, toString, wenn das ist erwartet ein use-case oder eine Anforderung, um das Objekt anzuzeigen, wie eine string-Darstellung (entweder in den logs auf der Konsole, oder irgendeine Art von Anzeige Baum).
Ansonsten Stimme ich mit der developer - jedes mal, wenn Sie etwas ändern, wird die toString brechen können. Möglicherweise müssen Sie vorsichtig sein, null-Werte usw.
Viele Male, aber es ist in der Tat Debuggen verwendet oder in die Protokollierung, so ist es nicht offensichtlich, dass Sie ausgelassen werden sollte bei aller.
Ich Stimme mit jsight, dass, wenn Sie sind bereits geschrieben, und geschrieben anständig, lassen Sie Sie in zumindest bis Sie in der Art und Weise (wie Sie tatsächlich fügen Sie ein Feld in einer Klasse).
Für debugging-Zwecke kann niemand schlagen
toString
. Es sind praktisch beide in einem debugger, und in einfachen debug-prints. Stellen Sie sicher, es zeigt alle Felder, die Ihreequals
undhashCode
Methoden basieren auf, wenn Sie überschreiben diese als gut!Für die Anzeige auf end-user, ich würde es nicht verwenden
toString
, obwohl. Dafür, ich denke es ist besser, schreiben Sie eine weitere Methode, das bedeutet die richtige Formatierung und i18n wenn Sie das brauchen.Macht es guten Sinn, weil Sie immer Probleme mit toStrings zeigt zu wenig oder zu viel Informationen.
Kann es Sinn machen, um Ihr team zu verwenden, die ToStringBuilder in Jakarta-Commons-Lang statt:
führt eine Introspektion, die das Objekt, und druckt die öffentlichen Felder.
http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/ToStringBuilder.html
Dies ist nicht eine Frage, die beantwortet werden können, die in isolation ... Sie sollten Fragen Sie den Kunden (oder den Menschen, Sie zu schreiben) was Sie denken der Idee. Wenn ich mit einem Java-Bibliothek und setzt dabei auf die toString () - überladungen für die Fehlersuche, ich wäre ziemlich genervt, wenn die Bibliothek die Entwickler beschlossen, zu bereinigen.
Um fair zu sein, sagte Entwickler hier, aber nicht dazu führen, dass Entwickler in jedem Sinne.
Das ursprüngliche Problem ist nicht unbedingt über toString(), aber über eine zweite Methode paramString:
"Mit allen string-Verkettung und null-Wert-Prüfung, paramString ist ein bug-magnet."
Sehen http://code.google.com/p/piccolo2d/issues/detail?id=99
Ich würde auf jeden Fall halten die toString () - Implementierungen, besonders für debugging-Zwecke. Als ein in Erster Linie C++ Entwickler, ich wünschte, die Dinge waren so einfach in C++ wie in Java in dieser Hinsicht (operator-überladung kann ein Schmerz sein).
Wenn es ein problem mit dem vorhandenen
toString()
Implementierungen, die Entwickler sollten das problem beheben. Sagen die aktuellen Implementierungen sind alle "reinen cruft" und entfernen Sie ist aktiv Schaden anzurichten, es sei denn, die vorhandenentoString()
Methoden sind ungemein schlecht geschrieben.Ich würde stark raten die Entwickler ab, entfernen alle funktionieren
toString()
Methode.umzusetzen, immer 🙂 Wie oben erwähnt, ist es von unschätzbarem Wert für das Debuggen.
Ist es gut für debugging-Zwecke. Aber wenn Sie anzeigen wollen, ein bestimmtes Objekt als string an die end-Benutzer sind, sollten Sie nie verwenden Sie toString () - Implementierung, sondern stellen Sie benutzerdefinierte Methode für diese.
So zu
Ich Stimme mit Ihrem team führen. Wenn Sie anzeigen wollen, ein Objekt an einen client verwenden benutzerdefinierte Implementierung. Wenn Sie möchten, verwenden Sie es für debugging-Zwecke verwenden Sie toString().
Obwohl
toString()
Methoden sind sehr hilfreich bei der Fehlersuche, Wert-Klassen, es kann argumentiert werden, Sie sind nicht nützlich für die entity-Klassen.Ich dachte, ich würde Wiegen mit einer moderneren Perspektive gegeben, dass diese Frage jetzt fast 10 Jahre alt.
toString
ist offensichtlich hilfreich für debugging - Sie müssen suchen Sie nicht weiter als all die anderen Antworten hier, die das belegen - aber debugging-Informationen nicht business-Logik.Dass ein
toString
Methode in jeder einzelnen Klasse ist die visuelle Unordnung, die verdunkelt das nützliche Verhalten der Klasse. Wir müssen auch daran denken, es zu erhalten - entweder manuell oder durch Regeneration der Methode von unserem IDE - jedes mal, wenn wir ändern die Klasse Felder.Also, was können wir tun, um diese Probleme anzugehen, ohne die der Methode insgesamt? Die Antwort ist automatisch generiert. Projekt Lombok
@ToString
annotation kann automatisch einetoString
Methode für Sie zur compile-Zeit, die enthält eine beliebige Kombination von Feldern, die Sie wählen.Basic-Beispiel für die Nutzung:
Werden äquivalent zu den folgenden zur compile-Zeit:
Bekommen wir eine ConcurrentModificationException geworfen von einem unserer toString () - Methoden, so gibt es eine gelegentliche Nachteil. Natürlich ist es unsere eigene Schuld, für die es nicht synchronisiert.