2010-08-03 10 views
5

Nel mio sistema ho una singola classe con un carico di (20?) finalbooleans che definisce le autorizzazioni di questo tipo di utente.Come posso rappresentare meglio le autorizzazioni degli utenti?

Qual è un modo migliore per farlo?

Sono sicuro che ci sono molti esempi a riguardo ma non conosco le parole chiave.

+0

puoi incollare qualche frammento di codice per apprezzare meglio quello che stai cercando di fare. –

risposta

12

è possibile usufruire di enumerazioni, ad esempio:

public enum Permission { 
    READ, WRITE; 
} 

public class User { 

    private final EnumSet<Permission> permissions; 

    public User(Permission... permissions) { 
     this.permissions = EnumSet.copyOf(Arrays.asList(permissions)); 
    } 

    public boolean hasPermission(Permission permission) { 
     return permissions.contains(permission); 
    } 

    //... 
} 

User user = new User(Permission.READ, Permission.WRITE); 
+0

btw: questo codice non viene compilato perché si crea un campo finale senza inizializzazione –

+3

+1, questo è ciò che intendevo nel mio commento alla risposta di tdammers. @ Flash - questo è completamente a posto, il campo è inizializzato nel costruttore. –

+0

Quel qualcosa di nuovo (per me), ma funziona davvero ;-). –

8

Creare una classe Permission e assegnare a ciascuna User una raccolta. Se è presente un'autorizzazione nella raccolta delle autorizzazioni dell'utente, l'utente ha l'autorizzazione, altrimenti no.

+0

Ha chiesto esplicitamente i booleani finali. –

+5

@Tim: Ha chiesto esplicitamente un modo migliore rispetto ai booleani finali. – sepp2k

+2

No, sta chiedendo un approccio migliore rispetto ai booleani finali – Arjan

0

Se non si conoscono le parole chiave e la sintassi, si potrebbe voler leggere un libro su Java o fare alcune esercitazioni online. Tuttavia, una classe potrebbe essere la seguente:

public class User { 

private final boolean admin, superuser, guest; 

public User(boolean admin, boolean superuser, boolean guest) { 
    this.admin = admin; 
    this.superuser = superuser; 
    this.guest = guest; 
} 

public boolean isAdmin() { 
    return admin; 
} 

public boolean isSuperuser() { 
    return superuser; 
} 

public boolean isGuest() { 
    return guest; 
} 

// and so on 
} 
3

esempio completo di ciò che @tdammers proposto:

class enum Permission { 
    WRITE, READ, EXECUTE, GROUP, OWNER 
} 

public class User { 
    protected Set<Permission> permissions; 

    public User() { 
     permissions = new EnumSet<Permission>(); 
    } 

    public boolean hasPermission(Permission p) { 
     return permissions.contains(p); 
    } 

    public void addPermisssion(Permission p) { 
     permissions.add(p); 
    } 

    public void removePermisssion(Permission p) { 
     permissions.remove(p); 
    } 
} 

//usage 
User u = new User(); 
u.addPermission(Permission.READ); 
System.out.writeln(u.hasPermission(Permission.WRITE)); 
u.removePermission(Permission.READ); 
5

È possibile utilizzare la maschera per questo

public interface IPersmisions { 

public static final int NONE = 1 << 0; 
public static final int LEVEL1 = 1 << 1; 
public static final int LEVEL2 = 1 << 2; 
public static final int LEVEL3 = 1 << 3; 
public static final int LEVEL4 = 1 << 4; 
public static final int LEVEL5 = 1 << 5; 
public static final int LEVEL6 = 1 << 6; 
public static final int LEVEL7 = 1 << 7; 
public static final int LEVEL8 = 1 << 8; 
public static final int LEVEL9 = 1 << 9; 
} 

ASSORBITO Si aggiunge

int permisions = IPersmisions.NONE; 

    public boolean checkPermission(int permission) { 
     return (permissions & permission) != 0; 
    } 

    public void addPermission(int permission) { 
      permissions = (permissions | permission); 
    } 

    public void removePermission(int permission) { 
     permissions = (permissions & ~permission); 
    } 

di quanto si possa impostare un facilmente impostare un gruppo per gli utenti

public interface IPermisionGroup extends IPermisions { 

    public static final int LEVEL1_2_3 = LEVEL1 | LEVEL2 | LEVEL3; 
    public static final int LEVEL4_5_6 = LEVEL4 | LEVEL5 | LEVEL6; 
    public static final int LEVEL7_8_9 = LEVEL7 | LEVEL8 | LEVEL9; 

} 

E il codice è possibile utilizzare è come questo

user.addPermision(IPermisions.LEVEL1); 

o

user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2); 

o

user.addPermision(IPermisionGroup.LEVEL1_2_3); 
+1

Rolling your own bitmask nel 2010 in. NET. Mi stai prendendo in giro. – epochwolf

+1

@eopchwolf: E cosa c'è che non va? btw non in .NET ma in Java. –

-1

Polimorfismo, non condizionale.

class User { 
    final Print print; 
    User(Print print) { 
     this.print = print; 
    } 
} 

interface Print { 
    void print(); 
} 

class CanPrint implements Print { 
    public void print() { do whatever it takes to print a user } 
} 

class CannotPrint implements Print { 
    public void print() { throw null; } 
} 
Problemi correlati