Enregistrer enum pour SharedPreference
Je me demandais, quelle est la méthode couramment utilisée pour sauver des Enum
à SharedPrefereces
? Actuellement, je suis en utilisant gson
pour convertir enum type String, puis l'enregistrer pour le SharedPrefereces
.
Gson gson = new Gson();
//country is an enum.
String json_country = gson.toJson(country);
sharedPreferences.edit().putString(COUNTRY, json_country);
Je me demandais, est-ce une bonne façon? Est-il un meilleur moyen?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez assotiate votre enums avec des entiers et de les stocker simple int, regardez ceci:
Cast Int enum en Java (deuxième réponse) - également de la même manière que vous pouvez faire
enumToInt
Vous pouvez utiliser une simple Chaîne de caractères, puis extraire de la valeur à l'aide de la méthode valueOf. Voici un exemple:
Voici un exemple de code que vous pouvez voir comment cela fonctionne.
https://github.com/jiahaoliuliu/SavingEnumToSharedPreferences
myEnum.name()
au lieu de.toString()
comme il peut être remplacéC'est le même problème que les Enterprise Java développeurs sont confrontés lors de la persistance d'un enum pour une base de données. Le problème avec les questions /réponses, c'est qu'ils sont fragiles et ne pas refactoring de l'environnement. Voici pourquoi (avec une alternative au fond.)
À l'aide d'un enum
toString()
etvalueOf()
méthodes signifie qu'une valeur d'énumération ne peut pas être renommé. Supposons que j'ai unVehicleType
enum avec des valeursCAR
etTRUCK
. Si je stocker la chaîne de caractères "CAMION" comme une valeur de préférence et puis renommezVehicleType.TRUCK
àVehicleType.PICKUP_TRUCK
dans la prochaine version de mon application, la chaîne stockée n'a plus de sens etvalueOf()
va jeter unIllegalArgumentException
.À l'aide d'une valeur ordinale signifie que les valeurs enum ne peut pas être re-commandé ou votre stockées les valeurs ne correspondent plus. Ce scénario est sans doute pire parce que votre application va continuer à courir, mais peut se comporter de manière inattendue, ce qui rend la question difficile de la piste vers le bas une fois qu'il est enfin remarqué et probablement impossible à corriger. Le même est vrai pour l'ajout d'une nouvelle valeur n'importe où, mais à la fin. Si j'ai ajouté une nouvelle
MOTORCYCLE
valeur au sommet, unCAR
stockées comme son ordinal (0) dans la version précédente de l'application serait de revenir en tant queMOTORCYCLE
après la mise à jour, et unTRUCK
(ordinal 1) deviendrait unCAR
.L'alternative que j'utilise consiste à ajouter un
final
champ enum et utiliser sa valeur, comme suit:De stocker une valeur en utilisant quelque chose comme
preferences.putString("vehicle_type", vehicleType.getCode())
et de les récupérer en utilisant quelque chose commevehicleType = VehicleType.lookupByCode(preferences.getString("vehicle_type", null))
.Cette approche nécessite un peu plus de code, mais à mon avis, c'est le plus robuste de la solution.
Compte tenu de toutes les options ci-dessus, j'ai décidé d'utiliser une autre solution pour le problème.
J'ai besoin seulement d'un ensemble de valeurs, sans aucune logique sur eux. Dans ce cas, il est possible d'utiliser des outils tels que l'
@IntDef
et@StringDef
au lieu d'utiliserenum
.La solution est sûr de revoir à la fois en termes de noms de variables et les variables de commande. La seule chose qui ne devrait pas être modifié - valeurs réelles. Cependant, par défaut le refactoring ne vous demandons pas de les changer en cas de modification du nom, de sorte qu'il n'est pas si facile à faire juste automatiquement (et
@IntDef
est mieux de ce point de vue que@StringDef
).Et voici le officiel doc