2009-02-19 8 views
10

Además, por supuesto, su uso con primitivos. La mayoría (si no todas) de las implementaciones que veo solo son útiles desde el punto de vista del programador.¿ToString() solo es útil para la depuración?


EDITAR: entiendo que se supone que debo anular el comportamiento por defecto, es por eso que he mencionado implementaciones :). Y obtengo el valor de anularlo en algunos componentes que requieren una representación de Cadena dentro de una GUI. Sin embargo, al menos en el JDK, veo lotes de implementaciones que solo se utilizan cuando es necesario depurar las instancias del objeto.

¿Por qué está arraigado en la clase Object, ya que eso solo parece útil para cosas de GUI/depuración? ¿Hay otros usos que no conozco?

+1

Orientación de la pregunta a varios idiomas está obligado a obtener diferentes resultados en función de las prácticas aceptadas de ese idioma. – Robin

Respuesta

12

toString() es útil siempre que desee una representación de cadena de un objeto. Naturalmente, eso ocurre con fines de depuración, pero también puede ser válido para mostrar los resultados de las operaciones al usuario.

Por ejemplo, supongamos que tiene una clase compleja que maneja números complejos.Si desea imprimirlos a un usuario en un formato como 3 + 2i, es útil si definen toString() ya que no tiene que escribir el formato cada vez y la salida será consistente. Si alguna vez desea cambiar esa representación, por ejemplo a 3 + 2j, solo necesita tocar el método toString() en la clase Complex.

Así que toString() no es para fines de depuración también, pero es una buena manera de obtener representaciones de cadena consistentes de sus objetos.

+0

De hecho, pero no, no hay ninguna garantía de que 'representación de cadena coherente' en absoluto. –

+0

Obtuve una clase FooFile con FooFileSections. Para escribir el archivo, simplemente anulo ToString para el archivo en sí: FooFile.ToString(), así como para cada sección de archivo: FooFileSections.ToString(). luego construyo el contenido del archivo llamando a ToString en la secuencia correcta para FooFileSections, y luego solo transfiero el texto. Probablemente no sea una buena manera en general, sino rápida y fácil. –

+0

"resultados de salida de operaciones para el usuario". Como el texto 'toString()' no está internacionalizado, es cuestionable cuán útil es el texto en general para el usuario. – Raedwald

17

No, la clave es que se supone que debes anular la implementación predeterminada de ToString() para que sea útil. ToString() puede ser una excelente manera de mostrar el valor de algo a la interfaz de usuario.

Un ejemplo simple sería si tiene una clase Name con tres cadenas (First, Middle, Last). Puede tener un método ToString() que lo formatee para la IU: "Último, Primero Medio", por ejemplo.

O una clase que almacena una operación matemática (valores Left = 2, Right = 3, Result = 6 y un operador enum = Multiplicar). Llame al ToString() para obtener "2 * 3 = 6".

Sin embargo, es probable que sea más común tener una variedad de diferentes To<qualifier>String() métodos, como la clase de .NET DateTime. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Editar: En cuanto a por qué está arraigado en la clase Object, es simplemente porque ToString() es una operación válida para nada.

Además, las cadenas pueden ser una buena forma de recopilar datos entre los tipos de datos o los consumidores de datos, ya que (prácticamente) se garantiza que son analizables y no requieren codificación o cuidado adicional.

+0

Seguimiento muy completo. Solo estoy pensando que el material de etiquetado de GUI para toString() se usa en exceso. ¿Por qué no algo como 'implementa la interfaz TextualRepresentation' o algo así? –

+0

Estoy de acuerdo en que es una operación válida para cualquier cosa, pero solo desde el punto de vista del programador. Mi punto es que no hay ningún contrato para especificar que el método debe proporcionar cadenas GUI-Friendly o exponer las partes internas específicas de la instancia (campos), que solo son útiles para programadores, IMHO –

+3

A menudo es malo para propósitos de UI, ya que no toma una configuración regional de usuario. No importa para la depuración, sí importa para los usuarios finales. – MSalters

0

ToString() también es invocado por .NET Framework implícitamente al imprimir cualquier objeto en una cadena.

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

es equivalente a

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

porque el ToString() se llama de forma implícita.

Creo, aunque no estoy seguro, que es utilizado por el depurador para el "valor" de un objeto. Esto puede ser bastante útil, aunque limitado. En la mayoría de los casos, escribir tu propio depurador sería una mejor idea.

+0

El depurador podría llamar a ToString() para algunos objetos, pero no a todos, como lo demuestra la Lista donde la salida del depurador es mucho más útil que la salida de ToString(). – jwg

0

En AS3, tuve que convertir una matriz 2D en una matriz 1D. El (la velocidad de carrera) más rápida y más fácil solución (tiempo de codificación) fue:

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

se sorprenda, pero que realmente funciona según lo previsto y bastante rápido, también!

1

Útil para

  1. Gui (complejo de propiedades cuando se utiliza PropertyGrid, texto de cabecera Formulario)
  2. DataBinding (esa es la forma en cómo se trabaja)

Y cualquier otra cadena de salida.

-1

Puede que no sea el uso "intented" pero yo he utilizado para la serialización de datos

storeToHardDrive(studentList.ToString()); 
13

Mi preferencia personal es que toString() debe Nunca usarse para otra cosa que la depuración de nada. Si desea producir una cadena para un objeto, proporcione un método diferente que documente claramente su intención (getName(), getDescription(), etc.). Nunca confíe en la implementación de un toString().

El problema es que muchos desarrolladores ven toString() como una cadena de nivel de depuración y no piensan en cambiarla (digamos cuando se agregan o eliminan nuevos campos). Diablos, algunos constructores automatizados de toString() usan la reflexión para generar un toString() desde los campos.

He encontrado esta preferencia me ha servido bien en los últimos años.

+0

Dado que The String es la construcción más útil en programación, puede ser extremadamente poderoso saber que cada objeto en su espacio de programa cumple un contrato para proporcionar una representación de cadena de sí mismo. Como con cualquier cosa poderosa, puede ser abusada, pero es un desperdicio evitarla. –

+1

Pero dado que el contrato a) no garantiza nada sobre el formato de la cadena yb) no proporciona una API simétrica para convertir de nuevo String al objeto, me parece que es un contrato débil. He depurado muchos problemas relacionados con el supuesto de un "contrato" inexistente para toString. –

+0

Tengo exactamente la misma vista. Creo que la representación gráfica de la etiqueta de GUI está usando demasiado el método. –

0

Aparte de lo que todo el mundo ha dicho, anulando ToString() también es útil cuando se utilizan controles que llaman. Por ejemplo, un cuadro combinado:

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

Todo lo que puedo decir es que he tenido descanso código cuando he cambiado el método toString de mi clase para mostrar información adicional de depuración.

El código en cuestión era una biblioteca de GUI que decidió usar el valor de toString como algo interno (fue hace un par de años ... Olvidé exactamente lo que era). El resultado final fue que ya no usé esa biblioteca.

Yo diría que, dado que un gran grupo de personas ven a String como utilizado para la depuración (independientemente de su opinión de para qué cree que debería ser utilizado) que es problemático hacer uso del valor devuelto por él hacer algo programático (como analizarlo) o mostrarlo a un usuario.

Si tiene el 100% de control de los métodos toString, haga lo que quiera.

Por lo tanto, para responder a la pregunta, no toString no solo es útil para la depuración, puede hacer lo que quiera con ella. Sin embargo, no se sorprenda si toString cambia de maneras que lo hacen infeliz.

+2

Todo lo que puedo decir es que más allá de la depuración, es una abstracción muy, muy permeable :) –

2

En primer lugar, el método toString debe devolver una representación textual legible por el hombre del objeto.

Este problema es criado en Effective Java como artículo 10: Siempre anular toString.

Se hace referencia a la Java API Specification para el método Object.toString:

El resultado debe ser una representación informativa concisa pero que es fácil para una persona a leer.

Aparte de la depuración, reemplazando el método de una clase toString puede ser útil cuando ading objetos en un JList o una JTable, que por defecto va a utilizar el método de toString para mostrar el objeto como una forma textual en la lista o mesa.

Por ejemplo, en mi caso, he reemplazado el toString método de objetos que se agregan a JList para que el usuario pueda ver información sobre el elemento en una lista a través de la GUI.

De hecho, hay casos en los que el método toString es útil para casos distintos a la depuración. La clave es hacer que el método toString devuelva información que sea realmente útil para que una persona vea, no la implementación predeterminada Object.toString donde la ubicación de la memoria del objeto se usa para su representación textual.

4

En mi experiencia, toString() tiene poco valor fuera de la depuración y el registro. No puede depender de su formato o contenido a lo largo del tiempo, por lo que, aparte de ser legible por el ser humano, no dependa de él para nada más que para los objetos más simples (como los tipos de objetos primitivos). Si hay varios miembros de datos, se espera que puedan cambiar en tipo o número a lo largo del tiempo, y el resultado de toString() junto con él.

Otro punto que me gustaría destacar. No llame a otros métodos en su toString(). Nada peor que verificar los contenidos variables en un punto de interrupción en el depurador, y luego tener más código ejecutado debido a llamadas de método en el toString().

3

Creo que es importante señalar que las personas que respondieron que mencionaron "toString" notaron que la "t" minúscula generalmente habla de Java, y las personas que respondieron que mencionaron "ToString" generalmente se refieren a C#. Por supuesto, esto no se aplica a todas las respuestas.

En mi propia observación (uso ambos a diario), se recomienda a los programadores en C# que anulen "ToString" para mostrar una representación textual útil. Mientras que, en Java, no veo esto casi tanto. De hecho, rara vez veo esto.

-JP

Cuestiones relacionadas