J'ai utilisé ToStringBuilder.reflectionToString(class)
dans commons-lang, pour implémenter toString()
pour les DTO simples. Maintenant, j'essaie d'utiliser Google Guava au lieu de la bibliothèque commune Apache. Et j'ai trouvé Objects.ToStringHelper
À Guava. Mais c'est trop verbeux s'il y a beaucoup de membres dans la classe. Par exemple:
@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass()).add("name", name)
.add("emailAddress", emailAddress)
.add("department", department).add("yearJoined", yearJoined)
.toString();
}
est beaucoup plus simple si j'utilise commons-lang:
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
Existe-t-il de meilleures façons d'implémenter toString()
avec Guava, pas avec commons-lang?
J'ai une petite astuce pour com.google.common.base.MoreObjects.toStringHelper()
de Guava. J'ai configuré IntelliJ IDEA pour l'utiliser lors de la génération automatique des méthodes toString()
. Je suppose que vous pouvez faire de même dans Eclipse. Voici comment le faire dans Intellij:
toString()
changer le modèle en:
public String toString() {
#set ($autoImportPackages = "com.google.common.base.MoreObjects")
return MoreObjects.toStringHelper(this)
#foreach ($member in $members)
.add("$member.name", $member.accessor)
#end
.toString();
}
enregistrer le modèle, fermer les fenêtres "Paramètres" et "Générer toString ()"
Guava's MoreObjects.toStringHelper()
lors de la génération des méthodes toString()
Lorsque vous ajoutez un nouveau champ à la classe, il suffit de recréer la méthode toString()
(IDEA vous demandera de confirmer que vous souhaitez remplacer la méthode toString()
existante).
MoreObjects.toStringHelper
Est conçu pour vous aider à écrire facilement des méthodes toString()
avec un format cohérent, mais il vous permet de contrôler les champs que vous incluez dans toString()
et devrait avoir des performances comparables à l'écrire manuellement. reflectionToString
est plus court à taper, mais il ne vous donne pas un contrôle explicite sur les champs inclus et, bien, il utilise la réflexion. Je ne le vois pas comme une meilleure alternative.
En guise de remarque, je pense que l'utilisation de toStringHelper
semble beaucoup plus propre si vous mettez un add
appel par ligne.
Il y a un plugin http://sourceforge.net/projects/guavaeclipse/ (vraiment petit) qui peut générer des méthodes toString (et égale hashcode aussi) en utilisant des classes Guava. C'est une bonne solution car les méthodes générées sont vraiment petites et n'encombrent pas la classe.
Il est à noter que Objects.toStringHelper a été déconseillé (à supprimer complètement en juin 2016) au profit de MoreObjects.toStringHelper. J'ai copié le modèle par défaut de Guava dans mon Intellij IDE dans un nouveau qui utilise à la place les MoreObjects. Cheers.
Parmi les plugins Eclipse disponibles, guavaeclipse utilise toujours MoreObjects.toStringHelper, mais Jenerate utilise MoreObjects.toStringHelper et fonctionne comme un charme.
Dans Eclipse, vous pouvez créer un modèle (pas aussi puissant que IntelliJ https://stackoverflow.com/a/9445402/1301197 =). Il ne fera pas de boucle sur tous les champs membres pour vous mais vous obtenez au moins le code environnant
windows > preferences > Java > Editor > Templates
${:import(com.google.common.base.MoreObjects)}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("${field}",${field})
.toString();
}
Cela ajoutera l'importation et vous obtiendrez quelque chose comme ceci si vous entrez id
comme champ. A vous ensuite d'ajouter les champs restants.
public String toString()
{
return MoreObjects.toStringHelper(this).add("id", id).toString();
}
Notez qu'il existe probablement une meilleure solution en utilisant le générateur Eclipse toString () et en créant un générateur toString () personnalisé. Mais c'est trop de travail pour un homme paresseux comme moi.
Cliquez avec le bouton droit puis sur source > generate toString()
et sélectionnez Générateur toString () personnalisé dans le style de code.