Est-ce une bonne ou une mauvaise pratique de générer automatiquement des méthodes toString
pour certaines classes simples?
Je pensais générer quelque chose comme ci-dessous où les noms de variables sont générés et une méthode toString
qui affiche le nom suivi de sa valeur.
private String name;
private int age;
private double height;
public String toString(){
return String.format("Name: %s Age: %d Height %f", name, age, height);
}
Eclipse 3.5.2 (et éventuellement les versions antérieures) fournit déjà cette fonctionnalité. Si vous faites un clic droit dans l'éditeur, vous le trouverez sous Source -> Générer toString () ...
Pour répondre à votre question sur le fait de savoir si le fonctionnement automatique de toString()
est une mauvaise pratique, mon avis est que ce n’est pas le cas. Si le code généré est très similaire au code que vous auriez écrit vous-même, alors pourquoi se donner la peine de le taper?
Personnellement, j'aime bien implémenter une méthode toString pour tous les objets, car cela facilite le débogage.
Je voudrais utiliser Apache Commons ToStringBuilder .
Vous pouvez implémenter une méthode toString simple en utilisant la réflexion comme suit:
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
En utilisant cette méthode, vous ne devrez pas mettre à jour votre méthode toString si/lorsque des champs sont ajoutés.
Si vous utilisez lombok ils ont une annotation @ToString qui générera le toString pour vous.
La raison pour laquelle il est préférable de l'utiliser au lieu de générer toString avec Eclipse, par exemple, est que si vous ajoutez, supprimez ou modifiez ultérieurement des attributs de la classe, vous devrez également régénérer toString. Si vous utilisez lombok vous n’avez pas à le faire.
Pour ajouter aux réponses de Steve et Don (+1 pour eux):
Faites en sorte que votre méthode toString()
soit simple, assurez-vous qu’elle ne déclenche pas d’exceptions (en particulier, soyez conscient des champs pouvant être nuls)
Si possible, n'appelez pas d'autres méthodes de votre classe. Au moins, assurez-vous que votre méthode toString()
ne modifie pas votre objet.
Et soyez conscient des boucles idiotes d'exception toString:
public class MyClass {
...
public String toString() {
// BAD PRACTICE 1: this can throw NPE - just use field1
return " field1=" + field1.toString()
+ " extraData=" + getExtraData();
// BAD PRACTICE 2: potential exception-toString loop
}
public MyExtraData getExtraData() {
try {
.... do something
} catch(Exception e) {
throw new RuntimeException("error getting extradata - " + this.toString(),e);
}
}
}
Dans IntelliJ Idea, vous pouvez appuyer sur alt + insert, la fenêtre contextuelle Générer s’ouvrira; Maintenant, sélectionnez les champs et cliquez sur le bouton OK; c'est tout.
Conseil supplémentaire: dans la boîte de dialogue Générer toString, vous pouvez choisir le modèle en cliquant sur la liste déroulante située dans la liste déroulante des modèles. Ici, vous pouvez sélectionner StringBuffer si vous en avez besoin ou tout autre modèle selon vos besoins. Jouez avec pour vous habituer. Je l'aime :)
Je viens de remarquer - Dans NetBeans IDE vous pouvez générer la méthode toString () en sélectionnant les champs que vous souhaitez générer pour right click->insert code
ou utiliser le raccourci ALT+INSERT
, puis en sélectionnant toString ().
C'est comme ça:
@Override
public String toString() {
return "ClassName{"+"fieldName="+fieldName+'}';
}
C'est un excellent moyen de déboguer et pas besoin de bibliothèques supplémentaires.
Soyez clair lorsque vous ajoutez toString () à l'audience du texte généré. Certains frameworks utilisent la méthode toString () pour générer du texte visible pour l'utilisateur final (par exemple, certains frameworks Web), alors que de nombreuses personnes utilisent les méthodes toString () pour générer des informations de débogage/développement. Dans les deux cas, assurez-vous que l'implémentation de toString est suffisamment unique pour satisfaire vos exigences.
L'implémentation par défaut de toString () dans le JDK génère des informations sur le développeur. C'est donc généralement le modèle que je recommande si possible, mais si vous travaillez sur un projet avec une idée/attente différente, vous risquez d'être confus ...