繁体   English   中英

Java:在框架中定义枚举(抽象枚举的解决方法)

[英]Java : Define an enum in a framework (workaround for abstract enum)

我想创建一个可以在许多不同系统中重用的全局框架。 我想包含一种枚举,其内容取决于项目。 具体来说,此枚举定义了不同类型的权限,优先级为int (admin = 100,高级用户= 50,基本用户= 10等)<-这些仅是示例,对于另一个项目,枚举的内容可能完全不同。 由于不可能有一个“抽象”的枚举,因此不幸的是我不知道如何实现它。 有人可以给我一些建议吗(例如设计模式,或其他)?

一些用例:

如果myauthorizationLevel = MyEnum.admin,则...

如果myauthorizationLevel.value> 25,则...

非常感谢你的帮助。

编辑:根据您的回答(都很好),我了解我的问题是(很抱歉以前没有说过,我当时看不到!):我需要一个函数来转换枚举中的字符串。 因此,如何使用“静态”功能实现此接口(我知道在接口中不可能实现静态,这将是一个问题),它给出了:

public interface IRole
{}

public enum ERole implements IRole
{}

那么我库中的最后一个函数将是:

public function IRole getRole()
{
          return IRole.getValueAsRole(myString);
}       

再次抱歉,以前没有对此进行解释。 我希望这很清楚。 从一开始,这实际上就是我的问题。

非常感谢

框架中的角色接口(Role.java):

public interface Role {
    int authorizationLevel();
}

框架(Roles.java)提供的一组角色:

public enum Roles implements Role {
    ADMIN(50),
    POWER_USER(30),
    LIMITED_USER(25),
    GUEST(10);

    private final int authorizationLevel;

    Role(int authorizationLevel) {
        this.authorizationLevel = authorizationLevel;
    }

    @Override
    public int authorizationLevel() {
        return authorizationLevel;
    }
}

框架中的权限检查器(Authorization.java):

public final class Authorization {
    static boolean isAuthorized(Role role) {
        return Roles.ADMIN.equals(role) ||
            role.authorizationLevel() > 25;
    }
}

框架的客户端(ClientRoles.java)提供的一组角色:

enum ClientRoles implements Role {
    WEB_DESIGNER(50);

    private final int authorizationLevel;

    @Override
    public int authorizationLevel() {
        return authorizationLevel;
    }
}

客户端应用程序(RoleBased MSMain.java):

public final class RoleBasedCMSMain {
    public static void main(String[] args) {
        Role role = ClientRoles.WEB_DESIGNER;
        if (Authorization.isAuthorized(role)) {
            System.out.println("You are authorized!");
        }
    }
}

不过,这是在重新发明轮子。 值得一看的是JAAS(Java身份验证和授权服务)可以解决这些问题并与现有框架集成。

枚举可以implement接口,因此您可以将该接口用作“抽象枚举”

interface Role{

}
enum SomeRoles implements Role{
ADMIN
}

因此,在您的外部API您可以使用该接口,以便人们可以提供自己的Role实施,但是他们可以使用您enum可用的功能

 void fn(Role role);

 fn(new MyRole()); // provided by user
 fn(SomeRoles.ADMIN); //provided by framework 

它是type-safeextensible

您可以使用必要的方法(例如authorizationLevel())定义接口。 由于枚举可以在项目上实现接口,因此可以创建一个枚举来实现该接口。 在应使用此类枚举的地方,可以使用该接口。 使用泛型,您甚至可以强制枚举应使用实现该接口的枚举。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM