2010-07-23 16 views
9

Nous avons-nous pris la décision de ne pas implémenter une méthode toString pour int[], mais de laisser hériter la méthode toString de Object?Langage Java avec toString

+5

Si vous avez besoin de la fonctionnalité ... connaissez-vous 'java.util.Arrays.toString' ...? –

+0

@Konrad, mais c'est un mauvais choix de conception pour utiliser une classe d'utilité, juste un IMHO pragmatique. –

+0

@Peter: Je ne le défendais pas. En ce qui me concerne, Java est une * série * de mauvais choix de conception. –

Répondre

8

Ils ont implémenté des méthodes toString plus raisonnables pour les tableaux. Ils sont situés dans la classe java.util.Arrays.

Comme pour le raisonnement. Je suppose que par les remplacements fournis dans la classe Arrays, essayer d'implémenter un toString générique pour différents types de tableaux est complexe ou impossible. La méthode toString devrait savoir sur quel type de tableau il travaillait, et sortir les données de façon appropriée. Par exemple, Object[] doit utiliser toString sur chaque élément, tandis que char[] doit générer le caractère et les types de données numériques doivent être convertis en une chaîne numérique.

Les méthodes dans Arrays obtiennent ceci gratuitement, parce que les types sont fixés en raison des remplacements.

+1

En fait, changer Object pour avoir un toString() raisonnable pour les tableaux est assez facile, mais pas recommandé. Encore mieux int [] a sa propre classe et il sait que son type pourrait faire ce que toString (int []) fait. –

+0

'changer l'objet pour avoir un sensible toString() pour les tableaux? Suggérez-vous de corriger le code source du soleil? –

+0

Sun corrige et libère le code source tout le temps, Java 6 jusqu'à la mise à jour 21. –

2

Je suppose en raison du raisonnement suivant: comment sauraient-ils comment les utilisateurs voudraient présenter leur tableau? Il pourrait "taille de tableau: 10" ou il pourrait être "[x, y, z]". Ils vous ont donné un défaut, si vous voulez faire quelque chose d'autre, c'est facile à faire.

Vous pouvez utiliser make ToStringBuilder apache il est plus facile ...

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

+2

Non seulement cela, mais il peut être désastreux d'appeler 'toString()' sur un tableau contenant 100 000 éléments. Et le but de 'toString()' n'est pas simplement d'afficher le contenu d'un objet, mais aussi d'afficher un formulaire lisible par l'homme à afficher dans les outils, débogueurs, etc –

2

Je dirais est que parce que les objets Array ne sont pas créés dans le code source Java par les concepteurs de langue - ils sont créés par le compilateur Java. Souvenez-vous que vous pouvez avoir un tableau de n'importe quel type d'objet et que le compilateur crée l'objet Array selon le type dont vous avez besoin.

Si elles devaient créer une méthode standard, il n'est pas immédiatement évident comment cela devrait fonctionner. Par exemple, l'exécution de toString() et la concaténation des résultats peuvent être OK pour un petit tableau mais cela ne fonctionne pas pour un tableau multidimensionnel ou un tableau avec 1 000 entrées. Je pense donc qu'aucune méthode toString() n'est créée pour garder tous les tableaux cohérents.

Certes, il est ennuyeux et parfois je pense que quelque chose le long des lignes de "Array[" + size + "] of " + getClassName() serait tellement mieux que la valeur par défaut.

+0

La première partie, je pense, la frappe juste sur la tête. –

1

Un peu de devinettes, mais ...

Il n'y a pas une représentation de chaîne évidente d'un tableau int. Les gens le font de différentes façons: séparés par des virgules, séparés par des espaces, entre parenthèses ou entre parenthèses ou rien. Cela a probablement conduit à la décision de ne pas l'implémenter dans Java 1.1, avec un code de priorité basse (puisque n'importe qui peut implémenter une méthode pour écrire un tableau en tant que chaîne très simplement).

Maintenant, vous ne pouvez pas le mettre à niveau dans Java 1.2 ou version ultérieure, car cela casserait la compatibilité pour ceux qui utilisent déjà l'ancien comportement. Vous pouvez cependant ajouter une classe utilitaire qui implémente certaines fonctionnalités, et c'est ce qu'ils ont fait avec java.util.Arrays.