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 ?

2voto

RCR Points 449

Le code suivant est un exemple. Question : au lieu d'utiliser la conversion basée sur l'IDE, existe-t-il un moyen plus rapide à mettre en œuvre pour qu'à l'avenir, en cas de changement, nous n'ayons pas besoin de modifier les valeurs encore et encore ?

@Override
    public String toString() {
        return "ContractDTO{" +
                "contractId='" + contractId + '\'' +
                ", contractTemplateId='" + contractTemplateId + '\'' +
                '}';
    }

2voto

granadaCoder Points 6390

Si vous êtes intéressé par les tests unitaires, vous pouvez déclarer un "ToStringTemplate" public, puis tester votre toString. Même si vous ne faites pas de tests unitaires, je pense que c'est plus "propre" et que vous utilisez String.format.

public class Kid {

    public static final String ToStringTemplate = "KidName='%1s', Height='%2s', GregCalendar='%3s'";

    private String kidName;
    private double height;
    private GregorianCalendar gregCalendar;

    public String getKidName() {
        return kidName;
    }

    public void setKidName(String kidName) {
        this.kidName = kidName;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public GregorianCalendar getGregCalendar() {
        return gregCalendar;
    }

    public void setGregCalendar(GregorianCalendar gregCalendar) {
        this.gregCalendar = gregCalendar;
    }

    public String toString() { 
        return String.format(ToStringTemplate, this.getKidName(), this.getHeight(), this.getGregCalendar());
    } 
}

Vous pouvez maintenant effectuer un test unitaire en créant le Kid, en définissant les propriétés et en effectuant votre propre string.format sur le ToStringTemplate et en comparant.

rendre ToStringTemplate statique-final signifie "UNE VERSION" de la vérité, plutôt que d'avoir une "copie" du modèle dans le test unitaire.

1voto

En fait, vous devrez retourner quelque chose comme ceci, car toString doit retourner une chaîne de caractères.

public String toString() {
 return "Name :" + this.name + "whatever :" + this.whatever + "";
}

et vous faites en fait quelque chose de mal dans le constructeur vous mettez la variable que l'utilisateur a mis au nom alors que vous devez faire le contraire. Ce que vous ne devriez pas faire

n = this.name

Ce que vous devez faire

this.name = n

J'espère que cela vous aidera.

1voto

user7321815 Points 11

Nous pouvons même écrire comme ceci en créant un nouvel objet String dans la classe et en lui assignant ce que nous voulons dans le constructeur et le retourner dans la méthode toString qui est surchargée

public class Student{  
 int id;  
 String name;  
 String address;  
 String details;
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 this.details=id+"  "+name+"  "+address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return details;  
 }  
 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()  
 }  
}

1voto

stinger Points 1309

Un moyen simple et concis consiste à utiliser les annotations Lombok. Il possède @ToString qui génèrera une implémentation de la méthode d'évaluation de la qualité de l'eau. toString() méthode. Par défaut, elle imprimera le nom de votre classe, ainsi que chaque champ, dans l'ordre, séparés par des virgules. Vous pouvez facilement personnaliser votre sortie en passant des paramètres à l'annotation, par exemple :

@ToString(of = {"name", "lastName"})

Ce qui équivaut à du pur Java :

public String toString() {
        return "Person(name=" + this.name + ", lastName=" + this.experienceInYears + ")";
    }

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