L'utilisation correcte de masque de bits?
héhé,
juste une question à propos des masques de bits. Je pense que je sais maintenant ce qu'ils sont et d'où ils peuvent être utilisés.
Je veux stocker des autorisations spécifiques comme la construction, de PAUSE et d'INTERAGIR et peut-être plus pour des groupes spécifiques. Le code ci-dessous devrait le faire, mais je ne suis pas très sûr de savoir si c'est la corrent "style".
L'idée est d'utiliser les 3 premiers bits ici pour stocker les autorisations du premier groupe, puis utilisez le prochain de trois bits pour le deuxième groupe, et ainsi de suite.
Donc ma question est maintenant de savoir si c'est une bonne voie ou pas, ou ce qui serait mieux?
public class Test {
private int permissions = 0;
/**
* The amount of permissions, currently: {@link #BREAK}, {@link #BUILD}, {@link #INTERACT}
*/
private static final int PERMISSIONS = 3;
/**
* The different permissions
*/
public static final int BUILD = 1, BREAK = 2, INTERACT = 4;
/**
* The different groups
*/
public static final int ALLIANCE = 0, OUTSIDERS = 1;
public void setPermissions(int permissions, int group)
{
this.permissions = permissions << group * PERMISSIONS;
}
public void addPermissions(int permission, int group)
{
setPermissions(this.permissions | permission, group);
}
public boolean hasPermission(int permission, int group)
{
return (permissions & permission << group * PERMISSIONS) == permission;
}
}
EDIT: je veux utiliser le moins de mémoire possible car je vais avoir besoin de stocker beaucoup de données.
EDIT: j'ai aussi besoin de le stocker dans une base de données sql, mais il ne faut pas faire de probs.
OriginalL'auteur maxammann | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Vous connu ce genre de réponse a dû apparaître tôt ou tard, donc, ici, il va:
Bien que l'utilisation de masques de bits est sans doute la manière la plus rapide et la plus basse de la mémoire consuption de toutes les autres options, il est également très enclins à faire des erreurs et c'est surtout déconseillé d'utiliser, sauf dans certains cas limites. C'est un classique de bas niveau de l'outil. Si c'est bien fait, fonctionne à merveille, si elle est mal utilisée, peut faire des ravages.
Par conséquent, la corriger approche consiste à utiliser des abstractions de niveau supérieur pour cela, à savoir
enums
etEnumSets
. La vitesse et de la mémoire consuption sont comparables, bien que légèrement pire, bien sûr. Dans un cas général, ils sont tout à fait suffisant, même si l'. Il existe de nombreuses façons de comment faire cela en fonction de votre contexte et de ses besoins. L'une des possibilités pourrait être ceci:Cela seul permet de vous faire exactement les choses que vous avez fait, mais avec deux différences:
EnumSet
ce petit est habituellement unlong
.MODIFIER pour répondre à l'OP du commentaire sur le stockage de l'EnumSet à une base de données:
Oui, cela peut être un sujet de préoccupation depuis de garder un
int
est infiniment plus facile. Si vous avez toujours considéré comme le coller à l'aide d'unEnumSet
, alors il y a plusieurs possibilités à partir du haut de ma tête:Regardez DONC. Les gens ont essayé de s'attaquer au problème avant.
Enregistrer les noms des valeurs dans le
EnumSet
:Vous pouvez ensuite facilement reconstruire les valeurs:
Enregistrer les ordinaux. C'est TRÈS dangereux, car on peut facilement se briser avec la modification de la
Permission
enum. Aussi, tout nombre aléatoire pourrait être nourris à briser ce.Vous pouvez ensuite facilement reconstruire les valeurs:
Sérialiser les
EnumSet
de la manière habituelle, et de stocker les données binaires directement ou BASE64ed. Euh.---
MODIFIER après MODIFIER:
Ad. vos remarques création des index pour votre
enum
valeurs de sorte que lorsque vous avez modifié ou réorganisées dans le futur, il fonctionne encore. Il y a un moyen facile de le faire avecenums
! En gros, c'est la voie du milieu entre bitfields etenums
, il conserve le type de sécurité et deenum
caractéristiques et encore a les avantages de la bitfields.Vous pourrez ensuite enregistrer les indices dans votre base de données et ne assurez-vous que l'analyse de ce qui est juste. Aussi, dans l'avenir, il contribue à seulement commenter (et non supprimer) tout inutiles, les valeurs de l'enum de sorte qu'ils restent toujours visibles pour vous, et vous n'en prenez pas, c'est l'index. Ou tout simplement le marquer comme
@Deprecated
et vous n'avez pas à supprimer quoi que ce soit ;).+1 pour EnumSet. Il en ait échappé à mon avis toutes ces années.
Stocker les autorisations dans un Tableau de Référence et un Table de Jonction pour attribuer des autorisations
Réponse édité pour décrire certains de ces options.
Donc, k, je ne peux pas le stocker dans un format binaire, parce que peut-être un site web permettra d'accéder à ces données, trop, en stockant le nom est peut-être pas la meilleure car peut-être que je change les noms des enums. À prefent le risque que je voudrais définir les id pour les enum entrées et les utiliser. Mais je ne suis pas sûr à 100% si je veux vraiment utiliser un EnumSet ou je peut utiliser le masque de bits. Le seul problème que je vois avec des masques de bits, c'est que si je prolonge le système d'autorisation il va se casser :/
OriginalL'auteur Petr Janeček
Il y a quelques points où je pense que vous avez fait une erreur
Cette opération efface toutes les autorisations pour d'autres groupes lors de la définition des autorisations pour
group
. Si vous souhaitez conserver les autorisations pour d'autres groupes,qui laisse les autorisations pour les autres ensembles intacte.
Ce mélange les autorisations pour tous les groupes ayant les permissions que vous voulez ajouter pour
group
. Je pense que ce que vous voulez il yajuste ajouter
permission
pourgroup
sans rien changer d'autre.Vous déplaçant dans la mauvaise direction ici, si
group > 0
, le bit à bit et n'aura pas de bits parmi les plus bas de trois,Fischer oh oui merci, la première fois j'ai vraiment utiliser cette thx 😛
OriginalL'auteur Daniel Fischer