2010-08-03 18 views
5

In meinem System habe ich eine einzelne Klasse mit einer Last von (20?) finalbooleans, die die Berechtigungen dieses Benutzertyps definiert.Wie kann ich Benutzerberechtigungen besser darstellen?

Was ist ein besserer Weg, dies zu tun?

Ich bin sicher, es gibt viele Beispiele dazu, aber ich kenne die Keywords nicht.

+0

können Sie bitte ein Code-Snippet einfügen, um besser zu verstehen, was Sie zu tun versuchen. –

Antwort

12

Sie können in Anspruch nehmen Aufzählungen, zB:

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: Dieser Code wurde nicht kompiliert, weil Sie ein Endfeld ohne Initialisierung erstellen –

+3

+1, das ist, was ich in meinem Kommentar zu Tdammers 'Antwort meinte. @Vash - das ist völlig in Ordnung, das Feld wird im Konstruktor initialisiert. –

+0

Das etwas neues (für mich), aber wirklich funktioniert ;-). –

8

Machen Sie eine Klasse Permission, und geben Sie jeder User eine Sammlung von ihnen. Wenn sich eine Berechtigung in der Berechtigungssammlung des Benutzers befindet, hat der Benutzer die Berechtigung, andernfalls nicht.

+0

Er fragte explizit nach endgültigen booleans. –

+5

@Tim: Er fragte explizit nach einem besseren Weg als Booleans. – sepp2k

+2

Nein, er bittet um eine bessere Annäherung als die letzten booleans – Arjan

0

Wenn Sie die Schlüsselwörter und die Syntax nicht kennen, möchten Sie vielleicht ein Buch über Java lesen oder einige Tutorials online machen. Allerdings könnte eine Klasse wie folgt aussehen:

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

Komplettes Beispiel von dem, was vorgeschlagen @tdammers:

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

können Sie verwenden die Maske dafür

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

Du

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

hinzufügen verwendet, als Sie eine leicht einstellen, eine Gruppe für Benutzer

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; 

} 

Und im Code festlegen können Sie ist wie folgt

user.addPermision(IPermisions.LEVEL1); 

oder

können
user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2); 

oder

user.addPermision(IPermisionGroup.LEVEL1_2_3); 
+1

Rollen Sie Ihre eigene Bitmaske im Jahr 2010 in .NET. Das soll doch wohl ein Scherz sein. – epochwolf

+1

@eopchwolf: Und was ist daran falsch? Übrigens nicht in .NET sondern in Java. –

-1

Polymorphie, nicht bedingt.

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