Pregunta

Además, por supuesto, su uso a partir de primitivas. La mayoría (si no todos) de las implementaciones que veo sólo son útiles desde el punto de vista del programador.


editar : Yo entiendo que se supone que debo anular el comportamiento por defecto, es por eso que he mencionado implementaciones :). Y lo hago obtener el valor de anular en algunos componentes que requieren una representación de cadena dentro de una interfaz gráfica de usuario. Sin embargo, en el JDK al menos, veo lotes de las implementaciones que sólo vienen a usar cada vez que se necesita depurar las instancias de objeto.

¿Por qué se arraiga en la clase Object, ya que es sólo parece útil para la materia GUI / depuración? hay otros usos que no estoy al tanto?

¿Fue útil?

Solución

toString () es útil siempre que lo desee una representación de cadena de un objeto. Naturalmente esto sucede para propósitos de depuración, pero también puede ser válida para los resultados de salida de las operaciones para el usuario.

Por ejemplo, digamos que usted tiene una clase compleja que se ocupa de los números complejos. Si desea imprimir en papel a un usuario en un formato como 3 + 2i , que es muy útil si definen toString (), ya que no tiene que escribir el formato de todos los tiempos y la salida será consistente. Si alguna vez desea cambiar esa representación, por ejemplo a 3 + 2j , sólo es necesario tocar el método toString () de la clase Complex.

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

Otros consejos

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

Un ejemplo sencillo sería si usted tiene una clase de nombre con un tres cuerdas (primero, segundo, apellido). Puede tener un método ToString() que da formato para la interfaz de usuario:. "Apellido, Nombre", por ejemplo

O una clase que almacena una operación matemática (los valores Izquierda = 2, derecha = 3, resultado = 6 y una enumeración operador = Multiplicar). ToString() llamar para conseguir "2 * 3 = 6".

No obstante , es probable que sea más común tener una variedad de diferentes métodos To<qualifier>String(), 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 lo

Además, las cadenas pueden ser una buena manera de cálculo de referencias entre tipos de datos o los consumidores de datos, porque es (prácticamente) garantiza que sea apta para su procesamiento y no requiere codificación o un cuidado especial.

Mi preferencia personal es que toString () debe no ser utilizado para otra cosa que la depuración de nada. Si se quiere producir una cadena de un objeto, proporcionar un método independiente que documenta claramente su intención (getName (), getDescription (), etc.). Nunca confiar en la implementación de un método toString ().

El problema es que muchos desarrolladores ver toString () como una cadena de nivel de depuración y no piensan nada de cambiarlo (por ejemplo cuando se añaden nuevos campos o eliminado). Heck, algunos toString automatizado () constructores utilizan para generar una reflexión toString () de los campos.

He encontrado esta preferencia me ha servido bien a lo largo de los años.

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 interfaz gráfica de usuario que decidió utilizar el valor de toString como algo interno (lo que era hace un par de años ... me olvido de lo que era exactamente). El resultado final fue que no hizo uso de esa biblioteca más.

Yo diría que ya que un gran grupo de personas ver toString de ser utilizado para la depuración (independientemente de su opinión de lo que usted piensa que debería ser utilizado para) que es problemático para hacer uso del valor devuelto de la misma para hacer nada programática (como analizarlo) o mostrar a un usuario.

Si no está 100% en el control de los métodos toString entonces por todos los medios hacer lo que quiera.

Así que, para responder a la pregunta, sin toString no sólo es útil para la depuración, se puede hacer lo que quiera con él. Sin embargo, no se sorprenda si los cambios toString en formas que te hacen infeliz.

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

Otro punto que me gustaría hacer con fuerza. No llamar a otros métodos en su toString (). No hay nada peor que el control de los contenidos variables en un punto de interrupción en el depurador, y luego tener más código se ejecuta debido a las llamadas de método en el método toString ().

Creo que es importante señalar las las personas que respondieron mencionando "toString" cuenta de la minúscula "t" en general, estamos hablando de Java, y las personas que respondieron mencionando "ToString" son generalmente refiriendo a C #. Por supuesto, esto no se aplica a todas las respuestas.

En mi propia observación (utilizo tanto al día), se anima a los programadores en C # para alterar "ToString" para mostrar una representación útil textual. Considerando que, en Java, no veo esto casi tanto. De hecho, rara vez ver esto.

-JP

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

Este problema se crió en Effective Java como Artículo 10 :. siempre anular toString

Se hace referencia a la Java API Especificación para la método Object.toString :

  

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

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

Por ejemplo, en mi caso, me ha redefinido el método toString de objetos que se añade a un JList para que el usuario podrá ver información sobre el elemento de una lista a través de la interfaz gráfica de usuario.

Así que, de hecho hay casos en los que el método toString es útil para casos distintos de depuración. La clave es tener la información de retorno del método toString que es realmente útil para una persona a ver, no la implementación Object.toString predeterminada en la que se utiliza la posición de memoria del objeto de su representación textual.

Útil para

  1. Gui (propiedad compleja 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.

ToString () también es llamado por el .NET Framework implícitamente al imprimir cualquier objeto fuera de una cadena.

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

es equivalente a

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

debido a que el ToString () se llama de forma implícita.

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

En AS3, tenía que convertir una matriz 2D en una matriz de 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!

Yo uso ToString () una tonelada para los formatos de fecha y hora.

http://hunterconcepts.com/content/tools/formats/

Aparte de lo que todo el mundo ha dicho, anulando ToString () también es útil cuando se utilizan controles que llaman. Por ejemplo, un 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.

puede que no sea la "intención" uso, pero lo he utilizado para la serialización de datos

storeToHardDrive(studentList.ToString());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top