78 votes

Impression de toutes les valeurs des variables d'une classe

J'ai une classe contenant des informations sur une personne qui ressemble à quelque chose comme ceci :

public class Contact {
    private String name;
    private String location;
    private String address;
    private String email;
    private String phone;
    private String fax;

    public String toString() {
        // Something here
    }
    // Getters and setters.
}

Je veux toString() pour revenir this.name +" - "+ this.locations + ... pour toutes les variables. J'ai essayé de l'implémenter en utilisant la réflexion comme le montre l'exemple suivant cette question mais je n'arrive pas à imprimer les variables d'instance.

Quelle est la bonne façon de résoudre ce problème ?

116voto

cletus Points 276888

De Mise en œuvre de toString :

public String toString() {
  StringBuilder result = new StringBuilder();
  String newLine = System.getProperty("line.separator");

  result.append( this.getClass().getName() );
  result.append( " Object {" );
  result.append(newLine);

  //determine fields declared in this class only (no fields of superclass)
  Field[] fields = this.getClass().getDeclaredFields();

  //print field names paired with their values
  for ( Field field : fields  ) {
    result.append("  ");
    try {
      result.append( field.getName() );
      result.append(": ");
      //requires access to private field:
      result.append( field.get(this) );
    } catch ( IllegalAccessException ex ) {
      System.out.println(ex);
    }
    result.append(newLine);
  }
  result.append("}");

  return result.toString();
}

59voto

Oscar Chan Points 509

Pourquoi voulez-vous réinventer la roue alors qu'il existe des logiciels libres qui font déjà très bien le travail.

Les deux apaches langue commune y printemps supportent des modèles de construction très flexibles

Pour apache, voici comment procéder de manière réfléchie

@Override
public String toString()
{
  return ToStringBuilder.reflectionToString(this);
}

Voici comment procéder si vous ne voulez imprimer que les champs qui vous intéressent.

@Override
public String toString() 
{
    return new ToStringBuilder(this)
      .append("name", name)
      .append("location", location)
      .append("address", address)
      .toString(); 
}

Vous pouvez aller jusqu'à "styliser" votre sortie imprimée en y ajoutant des éléments autres que les valeurs par défaut. ToStringStyle ou même de le personnaliser avec votre propre style.

Je n'ai pas personnellement essayé le printemps ToStringCreator mais elle est très similaire.

37voto

Linerd Points 370

Si vous utilisez Eclipse, cela devrait être facile :

1.Press Alt + Shift + S

2. choisissez "Generate toString()...".

Profitez-en ! Vous pouvez avoir n'importe quel modèle de toString()s.

Cela fonctionne également avec les getter/setters.

12voto

Stephane Chatre Points 21

Une ligne générique toString(), utilisant la réflexion et la personnalisation du style :

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
...
public String toString()
{
  return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}

6voto

Scott Stanchfield Points 15863

Lorsque vous accédez à la valeur du champ, passez l'instance plutôt que null.

Pourquoi ne pas utiliser la génération de code ici ? Eclipse, par exemple, générera pour vous une implémentation de reasoble toString.

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