簡體   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