web-dev-qa-db-fra.com

Utilisation des objets Google Guava. ToStringHelper

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?

Documents sur la goyave

52
philipjkim

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:

  • aller dans une classe
  • frappé Alt + Insert pour faire apparaître le menu "Générer"
  • choisissez toString()
  • cliquez sur le bouton "Paramètres"
  • allez dans l'onglet "Modèles"
  • créer un nouveau modèle nommé "MoreObjects.toStringHelper () de Guava (je l'ai fait en copiant le modèle" ToStringBuilder ")
  • 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 ()"

  • vous pouvez maintenant choisir le modèle 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).

110
Etienne Neveu

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.

Documents sur la goyave

30
ColinD

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.

11
marek.dominiak

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.

Documents sur la goyave

4
Morgan Kobeissi

Parmi les plugins Eclipse disponibles, guavaeclipse utilise toujours MoreObjects.toStringHelper, mais Jenerate utilise MoreObjects.toStringHelper et fonctionne comme un charme.

Documents sur la goyave

3
James

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.

0
Ronan Quillevere