[英]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-safe
且extensible
您可以使用必要的方法(例如authorizationLevel())定义接口。 由于枚举可以在项目上实现接口,因此可以创建一个枚举来实现该接口。 在应使用此类枚举的地方,可以使用该接口。 使用泛型,您甚至可以强制枚举应使用实现该接口的枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.