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

Java:在框架中定义枚举(抽象枚举的变通方法),java,jar,enums,abstract,Java,Jar,Enums,Abstract,我想创建一个可以在许多不同系统中重用的全局框架。 我想包括一种枚举,其内容取决于项目。具体地说,这个枚举定义了不同类型的权限,将int作为优先级(admin=100,advanced user=50,basic user=10等)25,然后 非常感谢你的帮助 编辑:根据你的回答(都很好),我明白我的问题是什么(很抱歉之前没有说这个,我当时看不出来!) 我需要一个函数来转换枚举中的字符串。 那么,我如何使用“静态”函数实现这个接口(我知道静态在接口中是不可能的,这将是一个问题),它给出: publ

我想创建一个可以在许多不同系统中重用的全局框架。 我想包括一种枚举,其内容取决于项目。具体地说,这个枚举定义了不同类型的权限,将
int
作为优先级(admin=100,advanced user=50,basic user=10等)25,然后

非常感谢你的帮助

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

public interface IRole
{}

public enum ERole implements IRole
{}
那么我的库中的最后一个函数是:

public function IRole getRole()
{
          return IRole.getValueAsRole(myString);
}       
再次抱歉,之前没有解释这一点。我希望这是清楚的。从一开始这就是我的问题


非常感谢

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

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

枚举可以实现接口,因此可以将接口用作“抽象枚举”

因此,在您的外部
API
中,您可以使用该接口,这样人们就可以提供自己的
角色的实现
,同时也可以使用您的
枚举中可用的内容

 void fn(Role role);

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

它是
类型安全的
,但是
可扩展的

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

因此,在您的外部
API
中,您可以使用该接口,这样人们就可以提供自己的
角色的实现
,同时也可以使用您的
枚举中可用的内容

 void fn(Role role);

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

它是
类型安全的
,但是
可扩展的

在您的框架(role.java)中是一个角色接口:

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

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

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

客户端应用程序(基于角色的MSMain.java):


不过,这是在重塑车轮。可能值得一看的是,哪些解决了这些问题并与现有框架集成。

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

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

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

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

客户端应用程序(基于角色的MSMain.java):


不过,这是在重塑车轮。可能值得一看的是,哪些解决了这些问题并与现有框架集成。

您必须更具体一些。我不太明白这个问题,我想是的。很难解释。因此,为了保持简单:我必须采取什么样的解决办法使枚举抽象(枚举在框架中声明,但为空,内容在具体项目中定义)?不,你不能,这不是枚举的意义。看看这个:你必须更具体一些。我不太明白这个问题,我想是的。很难解释。因此,为了保持简单:我必须采取什么样的解决办法使枚举抽象(枚举在框架中声明,但为空,内容在具体项目中定义)?不,你不能,这不是枚举的意义。看看这个:@Hermios这是你想做的事情吗?我很乐意根据需要进一步阐述。@Hermios这是你想要做的事情吗?我很高兴根据需要进一步阐述。
public interface Role {
    int authorizationLevel();
}
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;
    }
}
public final class Authorization {
    static boolean isAuthorized(Role role) {
        return Roles.ADMIN.equals(role) ||
            role.authorizationLevel() > 25;
    }
}
enum ClientRoles implements Role {
    WEB_DESIGNER(50);

    private final int authorizationLevel;

    @Override
    public int authorizationLevel() {
        return authorizationLevel;
    }
}
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!");
        }
    }
}