Est-il possible en Java de surcharger 'toString' pour un tableau Objects?
Est-il possible en Java pour remplacer une toString pour un tableau d'Objets?
Par exemple, disons que j'ai créé une classe simple, User
(il n'a pas vraiment d'importance quelle classe est-il puisque c'est une question d'ordre général). Est-il possible que, une fois que le client crée un User[]
tableau et le client utilise System.out.print(array)
il ne sont pas imprimer l'adresse du tableau, mais à la place une mesure toString()
?
PS: bien sûr je ne peux pas juste remplacer toString()
dans ma classe, car il est lié à un seul cas.
source d'informationauteur Popokoko
Vous devez vous connecter pour publier un commentaire.
Pas. Bien sûr, vous pouvez créer une méthode statique de l'Utilisateur.toString( Utilisateur[] ), mais il ne sera pas appelé implicitement.
Vous pouvez utiliser
Arrays.toString(Object[] a);
qui va appeler letoString()
méthode sur chaque objet du tableau.Modifier (de commentaire):
Je comprends ce que vous essayez d'atteindre, mais Java ne supporte pas qu'à cette époque.
En Java, les tableaux sont des objets qui sont créés dynamiquement et peuvent être affectés à des variables de type Objet. Toutes les méthodes de la classe de l'Objet peut être invoquée sur un tableau. Voir JLS Ch10
Lorsque vous appelez
toString()
sur un objet qu'elle renvoie une chaîne de caractères "textuellement représente" l'objet. Car un tableau est une instance de l'Objet qui est pourquoi vous obtenez seulement le nom de la classe, le @ et une valeur hexadécimale. Voir Objet#toStringLa Les tableaux de.toString() méthode renvoie l'équivalent de la matrice comme une liste, qui est itéré et
toString()
appelée sur chaque objet dans la liste.Ainsi, alors que vous ne serez pas en mesure de le faire
System.out.println(userList);
vous pouvez faireSystem.out.println(Arrays.toString(userList);
qui sera, pour l'essentiel d'obtenir la même chose.Vous pouvez créer une classe contenant la matrice, et de remplacer
toString()
.Je pense que la solution la plus simple est d'étendre la
ArrayList
classe, et de substituertoString()
(par exemple,UserArrayList
).La seule façon que vous pouvez faire c'est de re-compiler
Object.toString()
et ajouterinstanceof
clauses.J'avais demandé un changement dans le Projet d'une Pièce de monnaie en charge les tableaux dans un plus orienté objet. J'ai senti que c'en est trop pour les débutants, pour apprendre toutes les fonctionnalités dont vous avez besoin dans la gamme, les Tableaux et les 7 autres classes d'assistance qui sont couramment utilisés.
Je pense que dans la fin, il a été conclu que pour faire des tableaux correctement orientée objet est une tâche non triviale qui sera repoussé à Java 9 ou au-delà.
Essayer cette
de gros si vous avez personnalisé
user.toString()
méthodeVous ne pouvez pas le faire. Lorsque vous déclarez un tableau, puis Java, en fait, crée un objet caché de type Array. C'est un type de classe (par exemple, il prend en charge l'indice d'accès opérateur []) qui code ne peut pas accéder directement.
Si vous vouliez remplacer toString(), vous devez étendre cette classe. Mais vous ne pouvez pas le faire, car il est caché.
Je pense que c'est bon d'être de cette façon. Si l'on pouvait étendre la classe Array, alors on peut ajouter toutes sortes de méthodes. Et quand quelqu'un d'autre gère ce code, ils voient des méthodes personnalisées sur les tableaux et qu'ils sont "WTF... Est-ce que C++ ou quoi?".
Bien, vous pouvez essayer de placer tous les appels à
Object.toString
avec un AspectJ autour de conseils et de retour de la sortie désirée pour les tableaux. Cependant, je ne pense pas que c'est une bonne solution 🙂