如果我可以扩展Java枚举,我会做X

mom*_*omo 3 java enums java-ee

我有一个用于未来内部认证库的类(我知道已经存在这样的现有库).因此,为了使开发人员在未来的许多项目中使用它来尽可能简单地使用这个库,我想到他们定义了一个带有角色的枚举,简单的例子,角色sysadmin:

// Not a project specific class, but Auth is intended to be part of the library
class Auth {

        public static enum AUTH_ROLE {
            sysadmin( new Rule(AdminController.class, "*") );

            private String name;

            AUTH_ROLE() {
                name = this.name();
                Roles.add( name );
            }
            AUTH_ROLE(String name) {
                this.name = name;
                Roles.add( name );
            }

            AUTH_ROLE(Rule rule) {
                name = this.name();
                Roles.add( name, rule );
            }
            AUTH_ROLE(String name, Rule rule) {
                this.name = name;
                Roles.add( name, rule );
            }
            public String getName() {
                return name;
            }
        }

        public boolean hasRole(AUTH_ROLE role) {

            String[] usersRoles = getLoggedInUsersRoles();

            for ( String userRole : usersRoles ) {
                if ( role.getName().equals(userRole) )
                    return true;
            }

            return false;
        }

    }
Run Code Online (Sandbox Code Playgroud)

现在,你可以看到,在枚举AUTH_ROLE目前*定义*在什么是应该是一个非项目特定的类,但验证类应该是那就是库的一部分,许多项目中使用.

问题是,对于当前的设计,我不得不在同一个类Auth中定义角色及其规则,以便定义方法hasRole(AUTH_ROLE ...)...

我想做的是,将这个枚举与其中所有当前逻辑定义为所有项目的ONCE,并允许新项目中的开发人员能够简单地定义角色及其规则.

我认为存在的问题是你不能在Java中扩展枚举,所以枚举逻辑中的所有内容(虽然简单,不是重点!)实际上必须为每个新项目重复,并且可能在库中提供实现和接口.

如果可以扩展,那么新的枚举就能够简单地定义这些角色,即:

public enum AUTH_ROLE extends authlibrary.Auth.AUTH_ROLE {
    sysadmin( new Rule(AdminController.class, "*") );
} 
Run Code Online (Sandbox Code Playgroud)

其他选项,如我刚才提到的,就是定义一个接口用于枚举实现,但你可以理解我们最终每个新项目的实施,无论是复制和粘贴一样简单.

我没有兴趣在转换的东西字符串或数字调用该方法并没有什么......这个问题之前来回与其说是关于如何可以规避*局限性*的语言,而只是同意/接受他是一个限制,否则会导致代码更清晰.

那么,在这个特殊情况下,是否有人同意这一点,扩展/包含另一个枚举会有利于产生更少的代码?

PS.我可能是个白痴,所以我想保留正确的电话自己是个白痴:)

Jul*_*les 6

问自己这个问题:为什么你需要这个作为枚举?如果你的代码没有处理一个永远无法扩展的预定义的已知项集,那么你所拥有的东西根本不适合枚举,你可能会更好地使用扩展预定义库的单例对象类.

如果你没有使用枚举的有用功能 - 内置的字符串/序数转换内容 - 为什么要使用它们呢?这些有用的功能在你描述的情况下无法工作,因为它们需要生成需要知道所有枚举值名称的代码,而这些代码现在不可能发生.


duf*_*ymo 5

我不知道这将如何有价值.我不认为继承或延伸总是答案.如果枚举需要更多值,请添加它们.我不同意代码更清晰,或者这代表了语言的严重限制.