6 votes

Écrire toString() une fois pour toutes ?

Je veux que toutes mes classes mettent en œuvre toString() de la même manière en utilisant la réflexion Java. J'ai trouvé deux façons de procéder.

  1. Créer une classe de base telle que MyObject surcharge toString() et toutes mes classes l'étendraient, mais je ne suis pas sûr que ce soit excessif.

  2. Utilisez Eclipse pour générer le fichier toString() pour chaque classe. L'inconvénient est qu'il y aurait beaucoup de redondance dans le code.

Quelle est la méthode préférée ? Si vous utilisez les modèles Eclipse, y a-t-il un moyen de les générer automatiquement lorsque vous faites Nouveau > Classe, au lieu de devoir faire Source > Générer toString() à chaque fois ?

5voto

MeBigFatGuy Points 12489

Comme le dit Harkness, utilisez ReflectionToStringBuilder en commons-lang.

Plutôt que d'avoir une classe de base, j'utiliserais la méthode AOP telle que aspectj pour injecter cette implémentation dans toutes vos classes au moment de la compilation.

Une autre option consiste à utiliser un outil tel que ASM pour transformer vos classes au moment de la compilation afin d'injecter des méthodes toString. Les deux approches utilisent les mêmes concepts de base, ASM étant une version plus "brute" de la modification des fichiers de classe.

3voto

David Harkness Points 16674

Véase ToStringBuilder et sa sous-classe ReflectionToStringBuilder de Apache Commons Lang . Ce dernier vous permettrait de mettre en œuvre toString() de manière générique dans votre classe de base ou l'ajouter au modèle :

public String toString() {
    return ReflectionToStringBuilder.toString(this);
}

3voto

Bohemian Points 134107

L'option 1 est une très mauvaise idée, car elle impose une contrainte "est un" à vos implémentations sans raison valable, et chacune de vos classes doit hériter de la même classe de base. Il est peu probable que cela soit possible.

L'option 2 est également une mauvaise idée - vous auriez le même code répété dans tous un cauchemar en termes de maintenance et n'apporte aucune valeur ajoutée.

Il est préférable d'utiliser une classe utilitaire :

public class MyUtils {

    public static String toString(Object object) {
        // your reflection impl here
    }

}

public class MyClass {

    ...

    public String toString() {
        return MyUtils.toString(this);
    }
}

2voto

Kevin Points 10204

Vous pouvez aussi utiliser Lombok pour faire cela, voir :

http://www.projectlombok.org/features/ToString.html

Si vous souhaitez générer en plus tous les getters, setters, toString, hashCode et equals, vous pouvez utiliser la méthode @Data voir :

http://www.projectlombok.org/features/Data.html

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