96 votes

Comment surcharger toString() correctement en Java ?

Ça a l'air un peu stupide, mais j'ai besoin d'aide pour mon toString() et c'est très irritant. J'ai essayé de faire des recherches en ligne parce que le toString est celle où il se plante et "ne trouve pas le constructeur Kid #2" alors qu'il est là et je fais même autre chose et ça ne marche pas. Ok, c'était beaucoup, alors voici mon code :

import java.util.*; 
   class Kid {  
      String name; 
      double height; 
      GregorianCalendar bDay; 

      public Kid () { 
         this.name = "HEAD";
         this.height = 1; 
         this.bDay = new GregorianCalendar(1111,1,1); 
      } 

      public Kid (String n, double h, String date) {
      // method that toString() can't find somehow
         StringTokenizer st = new StringTokenizer(date, "/", true);
         n = this.name;
         h = this.height;
      } 

      public String toString() { 
         return Kid(this.name, this.height, this.bDay);
      } 
   } //end class 

Ok. Donc mon toString ci-dessus (je sais, mon troisième paramètre n'est pas bon, il devrait être une chaîne) est mauvais. Si je code en dur une valeur pour le troisième paramètre, il se détraque et dit qu'il ne peut pas le trouver (en haut). Alors comment puis-je obtenir la date et la décomposer ?

La classe qui l'appelle est la suivante

class Driver {   
   public static void main (String[] args) {   
      Kid kid1 = new Kid("Lexie", 2.6, "11/5/2009");   
      System.out.println(kid1.toString());
   } //end main method 
} //end class  

J'ai essayé de rechercher des constructeurs multiples et cela n'a pas vraiment aidé. J'ai essayé de rechercher toString() et essayé d'utiliser les méthodes précédentes toString() des méthodes logiques que j'ai créées précédemment mais c'est tout nouveau donc ça n'a jamais fonctionné.

Aide ?

148voto

adarshr Points 25912

Le site toString est censé retourner un String .

public String toString() { 
    return "Name: '" + this.name + "', Height: '" + this.height + "', Birthday: '" + this.bDay + "'";
} 

Je vous suggère d'utiliser les fonctionnalités de votre IDE pour générer le fichier toString méthode. Ne le codez pas à la main.

Par exemple, Eclipse peut le faire si vous cliquez simplement avec le bouton droit de la souris sur le code source et sélectionnez Source > Generate toString

15voto

Linux Le Points 436

Méthode Java toString()

Si vous souhaitez représenter un objet sous forme de chaîne, la méthode toString() entre en jeu.

La méthode toString() renvoie la représentation en chaîne de l'objet.

Si vous imprimez un objet, le compilateur java invoque en interne la méthode toString() sur l'objet. Ainsi, en surchargeant la méthode toString(), on renvoie la sortie souhaitée, qui peut être l'état d'un objet, etc. selon l'implémentation.

Avantage de la méthode Java toString()

En surchargeant la méthode toString() de la classe Object, nous pouvons renvoyer les valeurs de l'objet, ce qui nous évite d'avoir à écrire beaucoup de code.

Sortie sans la méthode toString()

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}  

Output:Student@2kaa9dc
       Student@4bbc148

Vous pouvez voir dans l'exemple ci-dessus #1. L'impression de s1 et s2 imprime les valeurs de Hashcode des objets mais je veux imprimer les valeurs de ces objets. Comme le compilateur java appelle en interne la méthode toString(), le fait de surcharger cette méthode renverra les valeurs spécifiées. Comprenons cela avec l'exemple donné ci-dessous :

Example#2

Output with overriding toString() method

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return id+" "+name+" "+address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
} 

Output:100 Joe success
       50 Jeff fail

Notez que toString() est principalement lié au concept de polymorphisme en Java. Dans Eclipse, essayez de cliquer sur toString() et faites un clic droit dessus, puis cliquez sur Open Declaration et voyez d'où vient la superclasse toString().

10voto

Basil Bourque Points 8938

Comme d'autres l'ont expliqué, le toString n'est pas l'endroit pour instancier votre classe. Au lieu de cela, le toString est destinée à construire une chaîne de caractères représentant la valeur d'une instance de votre classe, en indiquant au moins les champs de données les plus importants stockés dans cet objet. Dans la plupart des cas, toString est utilisé pour le débogage et la journalisation, et non pour votre logique d'entreprise.

Pour générer du texte représentant la valeur d'un objet pour l'afficher à un utilisateur, ajoutez une autre méthode. On nomme souvent cette méthode comme suit getDisplayName . Par exemple, DayOfWeek::getDisplayName y Month::getDisplayName .

StringJoiner

À partir de Java 8 et des versions ultérieures, la façon la plus moderne d'implémenter l'option toString utiliserait le StringJoiner la classe. Comme le dit le docteur :

StringJoiner est utilisé pour construire une séquence de caractères séparés par un délimiteur et commençant éventuellement par un préfixe fourni et se terminant par un suffixe fourni.

Utilisez comme ça :

@Override
public String toString ()
{
    return new StringJoiner(                           // In Java 8 and later, StringJoiner is used to construct a sequence of characters separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix.
                " | " ,                                // Delimiter
                Person.class.getSimpleName() + "[ " ,  // Prefix
                " ]"                                   // Suffix
            )
            .add( "name=" + name )                     // Append
            .add( "phone=" + phone )                   // Append
            .toString();                               // Convert entire sequence to a single `String` object.
}

Personne[ name=Alice | phone=555.867.5309 ]

record

Java 16 apporte une nouvelle façon de définir brièvement une classe dont le but principal est de communiquer des données de manière transparente et immuable : record .

Vous définissez un enregistrement en listant simplement le type et le nom de chaque champ membre. Le compilateur crée implicitement le constructeur, les récupérateurs, equals & hashCode y toString .

Mise en œuvre par défaut de toString

L'implémentation par défaut de toString comprend tous les champs des membres.

public Kid ( String name , double height , LocalDate birthDate ) {} 

Instanciez comme n'importe quel autre objet.

Kid alice = new Kid( "Alice" , 6.1d , LocalDate.of( 2019 , Month.April , 23 ) ) ;
String output = alice.toString() ;

Vous pouvez choisir de remplacer l'implémentation par défaut par la vôtre. Les surcharges ne sont généralement pas nécessaires étant donné qu'un enregistrement est un simple support de données.

4voto

sudmong Points 1748

Vous pouvez créer un nouvel objet dans la fonction toString(). utiliser

return "Name = " + this.name +" height= " + this.height;

au lieu de

return Kid(this.name, this.height, this.bDay);

Vous pouvez modifier la chaîne de retour selon vos besoins. Il existe d'autres façons de stocker la date au lieu du calendrier.

3voto

Adrian Pronk Points 5810

Vous ne pouvez pas appeler un constructeur comme s'il s'agissait d'une méthode normale, vous ne pouvez l'appeler qu'à l'aide de la commande new pour créer un nouvel objet :

Kid newKid = new Kid(this.name, this.height, this.bDay);

Mais construire un nouvel objet à partir de votre méthode toString() n'est pas ce que vous voulez faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X