2010-08-03 9 views
5

En mi sistema tengo una sola clase con una carga de (20?) finalbooleans que define los permisos que tiene este tipo de usuario.¿Cómo puedo representar mejor los permisos de usuario?

¿Cuál es la mejor manera de hacerlo?

Estoy seguro de que hay muchos ejemplos al respecto, pero no conozco las palabras clave.

+0

puede por favor pegar algún fragmento de código para apreciar mejor lo que está tratando de hacer. –

Respuesta

12

usted puede tomar ventaja de las enumeraciones, por ejemplo:

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

por cierto: este código no compilará porque crea un campo final sin inicialización –

+3

+1, esto es lo que quise decir en mi comentario con la respuesta de tdammers. @Vash - esto está completamente bien, el campo se inicializa en el constructor. –

+0

Eso es algo nuevo (para mí), pero realmente funciona ;-). –

8

Haz una clase Permission, y dale a cada User una colección de ellas. Si hay un permiso en la colección de permisos del usuario, entonces el usuario tiene el permiso, de lo contrario no.

+0

Solicitó explícitamente booleanos finales. –

+5

@Tim: explícitamente pidió una mejor manera que los booleanos finales. – sepp2k

+2

No, él está pidiendo un mejor enfoque que booleanos finales – Arjan

0

Si no conoce las palabras clave y la sintaxis, es posible que desee leer un libro sobre Java o hacer algunos tutoriales en línea. Sin embargo, una clase podría tener este aspecto:

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

Ejemplo completo de lo @tdammers propuesta:

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

Se puede utilizar la máscara para este

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; 
} 

en el usado cuando agrega

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); 
    } 

que usted puede establecer un fácil establecer un grupo de usuarios

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; 

} 

Y en el código que puede utilizar es como esta

user.addPermision(IPermisions.LEVEL1); 

o

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

o

user.addPermision(IPermisionGroup.LEVEL1_2_3); 
+1

Rodando tu propia máscara de bits en 2010 en .NET. Tienes que estar bromeando. – epochwolf

+1

@eopchwolf: ¿Y qué tiene de malo? Por cierto, no en .NET sino en Java. –

-1

Polimorfismo, no condicionales.

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; } 
} 
Cuestiones relacionadas