2010-02-15 5 views
2

Je souhaite stocker les permissions dans un ensemble de bits pour les comparer efficacement en Java. Un 1 signifierait l'autorisation accordée et 0 l'autorisation refusée. Si l'autorisation est effectuée, les autorisations requises seront comparées à l'ensemble d'autorisations.Comparer les ensembles de bits efficacement

Mon idée est d'utiliser ET et de comparer le résultat avec les autorisations demandées.

Exemple:

 0010 1101 Granted Permissions 
AND 0000 0101 Requested Permissions 
= 0000 0101 Result 

if (Result == Requested Permissions) 
    allow 
else 
    deny 

pourrait-il être fait plus efficace ou simple?

Répondre

5

Je vais me concentrer sur la partie "simple", car je ne pense pas que cette opération sera un goulot d'étranglement dans les applications sérieuses.

Vous pouvez utiliser un BitSet qui a toutes les opérations nécessaires.

Une approche plus OO et beaucoup plus facile à comprendre et à lire serait de représenter vos permissions avec un enum et d'utiliser un EnumSet. Pour les énumérations avec seulement quelques valeurs, il sera à peu près aussi performant que le BitSet, car il utilisera une implémentation très similaire.

+0

Je préférerais EnumSet, mais l'énumération correspondante devait être présente au moment de la compilation de ma bibliothèque. Mais l'utilisateur de la bibliothèque devrait être capable de définir ses propres autorisations. – deamon

+0

Dans ce cas, vous pouvez toujours utiliser un BitSet. –

2

Si vous utilisez Java 5 ou version ultérieure, je recommande d'utiliser Enum (s) et un EnumSet à la place. C'est beaucoup plus facile à gérer et AFAIK fonctionne aussi bien.

1

Votre approche est parfaitement bien et fonctionnera comme prévu. Bien sûr, vous pouvez le faire de plusieurs façons plus compliquées, mais je ne vois rien de mal à utiliser des opérateurs de manipulation de bits si le contexte correspond à votre cas. Après tous ces opérateurs font partie du langage noyau Java et ne sont pas marqués comme @deprecated ou @evil.

Questions connexes