Stockage et récupération d’énumérations dans SQLite avec Java

J’ai besoin de pouvoir stocker et extraire des énumérations d’une firebase database SQLite, que j’ai résolues avec l’utilisation combinée d’une classe wrapper et d’énums, mais j’estime qu’elles sont très mal conçues.

Chaque fois que je veux append un nouvel élément à la liste des énumérations, je dois l’append à trois endroits différents.

L’énumération doit contenir:

  • un int (ou une chaîne) pour le représenter
  • une chaîne de texte donnant un texte complémentaire sur l’énumération elle-même
  • une méthode pour restaurer son état de la firebase database

Actuellement, il est implémenté comme ceci:

public class items { public enum types { FOO(0), BAR(1), BAZ(2); private final int _value; types(int value){_value = value;} public int value(){return _value;} } public static types Get(int i) { switch(i) { case 0: return types.FOO; case 1: return types.BAR; case 2: return types.BAZ; default: return null; } } public static Ssortingng Get(Typer type) { switch(type) { case FOO: return "This is foo!"; case BAR: return "This is bar!"; case BAZ: return "This is baz!"; default: return "No good!"; } } } 

Y a-t-il une meilleure façon de gérer cela?

Une valeur enum a la fonction FOO.ordinal() est une représentation numérique d’une valeur. La fonction renvoie son nombre compris entre zéro et n-1n – combien d’énumérations avez-vous. Vous pouvez ensuite utiliser types.values()[i] pour récupérer une valeur par le nombre. Mais vous devez garder à l’esprit qu’il est interdit de réorganiser ou d’append une nouvelle énumération au milieu, car les chiffres seront modifiés.

Vous pouvez également utiliser types.valueOf("FOO") et FOO.name() pour une représentation sous forme de chaîne de la valeur enum. Son utilisation est plus sûre, car cela ne dépend pas de l’ordre de déclaration.

Vous pouvez utiliser le nom de l’énum pour le stockage et la récupération.

types.valueOf("FOO") devrait fournir types.FOO et types.FOO.name() vous types.FOO.name() le nom de l’énum.

Si vous voulez le récupérer avec une variable membre, vous pouvez faire quelque chose comme ceci:

 public static Types byValue(final int value) { Types returnvalue = FOO; // default returnvalue for (final Types type : Types.values()) { if (type.value == value) { returnvalue = type; break; } } return returnvalue; } 

Si les performances sont critiques, vous pouvez placer tous les types dans une carte statique avec la «valeur» comme clé. Ensuite, vous n’avez pas besoin de la boucle et ne dites que valueMap.get(value) . La carte doit être initialisée dans un bloc statique dans l’énumération.

Pour la valeur de texte supplémentaire, vous pouvez donner à enum une deuxième variable membre de type Ssortingng avec un getter. Les valeurs int et Ssortingng associées ne figurent donc que dans l’initialisation.

Par exemple,

 FOO(0,"Hello I'm Foo"), BAA(1,"Hello I'm Baa"), ...