3

我有一个旨在用于未来内部身份验证库的类(我知道已经有这样的现有库)。因此,为了让开发人员在未来的许多项目中使用它以利用这个库尽可能简单,我想到他们定义了一个带有角色的枚举,简单的例子,角色 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;
        }

    }

现在,如您所见,枚举 AUTH_ROLE当前*定义* 在应该是非项目特定的类中,但 Auth 类应该是许多项目要使用的库的一部分。

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

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

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

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

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

正如我刚才提到的,另一个选项是为枚举定义一个要实现的接口,尽管您可以理解我们最终为每个新项目都有一个实现,就像复制和粘贴一样简单。

我对在调用方法之前来回将内容转换为字符串或数字不感兴趣,什么不是......这个问题不是关于如何规避*语言的限制*,而只是同意/接受这是一个限制,否则会导致代码更清晰。

那么,在这种特殊情况下,是否有人同意这一点,扩展/包括另一个枚举会是有益的,这会导致更少的代码?

附言。我可能是个白痴,所以我想保留自称白痴的权利:)

4

2 回答 2

6

问问自己这个问题:为什么需要将其作为枚举?如果您的代码没有处理预定义的、已知的一组永远无法扩展的项目,那么您所拥有的根本不适合枚举,您最好使用扩展预定义基的单例对象班级。

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

于 2012-04-12T09:19:05.620 回答
5

我看不出这会有什么价值。我不认为继承或扩展总是答案。如果枚举需要更多值,请添加它们。我不同意代码更干净,或者这代表了语言的严重限制。

于 2012-04-12T09:10:24.617 回答