[英]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.