2017-07-11 4 views
3

J'utilise Retrofit avec GSON pour récupérer des données à partir d'une API et désérialiser à des objets Java en utilisant l'annotation @SerializedName de GSON comme ci-dessous:Comment utiliser plusieurs annotations Java avec la même valeur?

public class MyApiObject { 
    @SerializedName("apiJsonKey") 
    private String myValue; 
    ... 
} 

Il fonctionne très bien, mais je dois envoyer des objets de MyApiObject à un Base de données Firebase et pour cela l'objet doit être sérialisé en JSON. L'API Java de Firebase le fait automatiquement, mais elle génère les clés en fonction des noms de la variable d'instance (myValue) et non du nom sérialisé ("apiJsonKey"). Je sais que je peux utiliser l'annotation @PropertyName de Firebase, mais cela nécessiterait que j'utilise deux annotations avec les mêmes valeurs, ce qui est redondant et sujet aux erreurs.

Y a-t-il une meilleure façon de procéder?

Répondre

2

L'approche habituelle dans ce cas est de définir une constante et de l'utiliser dans les deux annotations.

public class MyApiObject { 
    private static final String MY_VALUE_NAME = "apiJsonKey"; 

    @SerializedName(MY_VALUE_NAME) 
    @ParameterName(MY_VALUE_NAME) 
    private String myValue; 
    ... 
} 

Ceci est assez courant dans les annotations de séquence pour JPA.

+0

J'ai pensé à cette approche, mais ma classe a plus d'une douzaine de tels paramètres/variables d'instance, dont chacune nécessiterait une chaîne constante séparée. Cela semble inutile, est-ce vraiment la meilleure façon d'y aller? – Sumit

+0

Alors peut-être que votre classe représente trop de choses. Lorsque vous vous retrouvez avec de grosses classes, cela signifie généralement qu'ils pourraient être divisés en petites classes qui travaillent ensemble. Même si votre cas ne correspond pas à plusieurs classes, je pense qu'il est préférable de ne pas introduire de code sujet à erreur, même s'il est plus grand, et comme vous l'avez dit, utiliser la même chaîne à plusieurs reprises est une mauvaise idée. – gmanjon

+0

Une autre option consiste à séparer une classe de constantes. Mais généralement les classes et les paquets avec des noms comme les constantes, les communs, les utils, etc finissent par être un trou pour le code que vous ne savez pas où mettre. Je pense qu'il est préférable de passer plus de temps à définir, redéfinir et affiner vos cours. Cela prend trop de temps, mais vous finissez généralement avec un design plus fort, plus lisible et plus supportable. – gmanjon