我有一个旨在用于未来内部身份验证库的类(我知道已经有这样的现有库)。因此,为了让开发人员在未来的许多项目中使用它以利用这个库尽可能简单,我想到他们定义了一个带有角色的枚举,简单的例子,角色 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, "*") );
}
正如我刚才提到的,另一个选项是为枚举定义一个要实现的接口,尽管您可以理解我们最终为每个新项目都有一个实现,就像复制和粘贴一样简单。
我对在调用方法之前来回将内容转换为字符串或数字不感兴趣,什么不是......这个问题不是关于如何规避*语言的限制*,而只是同意/接受这是一个限制,否则会导致代码更清晰。
那么,在这种特殊情况下,是否有人同意这一点,扩展/包括另一个枚举会是有益的,这会导致更少的代码?
附言。我可能是个白痴,所以我想保留自称白痴的权利:)