2010-07-23 19 views
9

Nosotros tomamos la decisión de no implementar un método toString para int[], pero en cambio dejarlo heredar el método toString de Object?Java Language Design with toString

+5

En caso de que necesite la funcionalidad ... ¿sabe usted de 'java.util.Arrays.toString' ...? –

+0

@Konrad, pero es una opción de diseño pobre utilizar una clase de utilidad, solo una en mi humilde opinión. –

+0

@Peter: Yo no estaba defendiéndolo. En lo que a mí respecta, Java es una * serie * de malas elecciones de diseño. –

Respuesta

8

Implementaron métodos más razonables toString para matrices. Están ubicados en la clase java.util.Arrays.

En cuanto a razonamiento. Asumo por las anulaciones provistas en la clase Arrays, que tratar de implementar un toString genérico para diferentes tipos de matrices es complejo o imposible. El método toString tendría que saber en qué tipo de matriz estaba trabajando y generar los datos de forma correspondiente. Por ejemplo, Object[] debe usar toString en cada elemento, mientras que char[] debe generar el carácter, y los tipos de datos numéricos deben convertirse en una cadena numérica.

Los métodos en Arrays obtienen esto de forma gratuita, porque los tipos son corregidos debido a las anulaciones.

+1

Cambiar objeto en realidad para tener un toString() sensible para matrices es bastante fácil, simplemente no recomendado. Incluso mejor int [] tiene su propia clase y sabe que su tipo podría hacer lo que hace toString (int []). –

+0

'¿Cambiar Objeto para tener un toString() sensible para matrices? ¿Estás sugiriendo parchar el código fuente del sol? –

+0

Sun realiza correcciones y versiones del código fuente todo el tiempo, Java 6 está actualizado 21. –

2

Supongo que por el siguiente razonamiento: ¿cómo sabrían cómo los usuarios querrían presentar su matriz? Podría "tamaño de matriz: 10" o podría ser "[x, y, z]".

Te dieron un valor predeterminado, si quieres hacer otra cosa es fácil de hacer.

Puede utilizar ToStringBuilder de Apache que sea más fácil ...

http://commons.apache.org/lang/api/org/apache/commons/lang/builder/ToStringBuilder.html

+2

No solo esto, sino que puede ser desastroso llamar a 'toString()' en una matriz con 100.000 elementos. Y el propósito de 'toString()' no es solo mostrar el contenido de un objeto, sino también mostrar una forma legible por humanos para mostrar en herramientas, depuradores, etc. –

2

Mi conjetura sería es que debido a objetos Array no fueron creados en el código fuente de Java por los diseñadores del lenguaje - que son creados por el compilador de Java. Recuerde, puede tener una matriz de cualquier tipo de objeto y, por lo tanto, el compilador crea el objeto Array según corresponda para el tipo que requiera.

Si crearan un método estándar, no es inmediatamente obvio cómo debería funcionar. Por ejemplo, ejecutar toString() y concatenar los resultados puede estar bien para una matriz pequeña pero no funciona para una matriz multidimensional o una matriz con 1,000 entradas. Así que creo que no se creó ningún método toString() para mantener todas las matrices consistentes.

Es cierto que es molesto y a veces creo que algo así como el "Array[" + size + "] of " + getClassName() sería mucho mejor que el predeterminado.

+0

La primera parte de esto, creo, la golpea justo en la cabeza. –

1

Un poco de conjeturas aquí, pero ...

No hay una representación de cadena obvia de una matriz int. La gente lo hace de diferentes maneras: separados por comas, separados por espacios, encerrados entre paréntesis o entre paréntesis o nada. Eso probablemente impulsó la decisión de no implementarlo en Java 1.1, junto con el código de baja prioridad (ya que cualquiera puede implementar un método para escribir una matriz como una cadena de forma muy simple).

Ahora no puede actualizarlo en Java 1.2 o posterior porque eso rompería la compatibilidad para cualquiera que ya esté usando el antiguo comportamiento. Sin embargo, puede agregar una clase de utilidad que implemente alguna funcionalidad, y eso es lo que hicieron con java.util.Arrays.