2017-07-11 2 views
3

I Retrofit bin mit zusammen mit Gson Daten aus einer API zum Abrufen und deserialisieren es in Java-Objekten wie unter Gson der @SerializedName Anmerkung mit:Wie werden mehrere Java-Annotationen mit demselben Wert verwendet?

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

Es funktioniert gut, aber ich brauche Objekte von MyApiObject zu einem schicken Firebase-Datenbank und dafür muss das Objekt wieder in JSON serialisiert werden. Die Java-API von Firebase führt dies automatisch aus, generiert jedoch die Schlüssel basierend auf den Namen der Instanzvariablen (myValue) und nicht auf dem serialisierten Namen().

Ich weiß, ich kann Firebase @PropertyName Annotation verwenden, aber das würde erfordern, dass ich zwei Anmerkungen mit den gleichen Werten verwenden, die redundant und fehleranfällig ist.

Gibt es einen besseren Weg, dies zu tun?

Antwort

2

Der übliche Ansatz in diesen Fällen besteht darin, eine Konstante festzulegen und sie in beiden Annotationen zu verwenden.

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

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

Dies ist ziemlich üblich in Sequenz Anmerkungen für JPA.

+0

Ich habe über diesen Ansatz nachgedacht, aber meine Klasse hat über ein Dutzend solcher Parameter/Instanzvariablen, von denen jede eine separate Konstante String benötigen würde. Es scheint einfach unnötig, ist das wirklich der beste Weg zu gehen? – Sumit

+0

Dann repräsentiert deine Klasse vielleicht zu viele Dinge. Wenn Sie mit großen Klassen enden, bedeutet das normalerweise, dass sie in kleinere Klassen aufgeteilt werden können, die zusammen arbeiten. Selbst wenn Ihr Fall nicht zu mehreren Klassen passt, ist es besser, keinen fehleranfälligen Code einzuführen, auch wenn er größer ist, und wie Sie bereits sagten, ist die wiederholte Verwendung derselben Zeichenfolge eine schlechte Idee. – gmanjon

+0

Eine andere Option besteht darin, eine Klasse von Konstanten zu trennen. Aber normalerweise Klassen und Pakete mit Namen wie Konstanten, common, utils, usw. enden als ein Loch für Code, den Sie nicht wissen, wo Sie setzen. Ich denke, es ist besser, mehr Zeit mit der Definition, Neudefinition und Verfeinerung Ihrer Klassen zu verbringen. Es dauert zu lange, aber Sie haben in der Regel ein stärkeres Design, besser lesbar und haltbar. – gmanjon

Verwandte Themen