【发布时间】:2016-06-23 08:52:31
【问题描述】:
在 Java 中,我一直在尝试找到一种方法:
- 以可以访问的方式对枚举进行分组,例如:MainGroup.FirstEnumGroup.GREEN。
- 使用分组枚举,有一个可以引用枚举组的基本枚举(有点像低音类)。在下面的示例中,MainGroup 是 2 个单独枚举组的基本枚举。但是,问题是,MainGroup 无法引用 FirstEnumGroup 或 SecondEnumGroup。
- 能够将枚举组传递给单个方法进行处理。
例如,假设我有两个单独的枚举。而且我希望能够调用传递两个单独枚举中的任何一个的方法。我能看到这个工作的唯一方法是通过两个单独的方法来接收每个单独的枚举。相反,我想找到一种方法来对枚举进行分组并允许用户从组中选择一个枚举,并让一个方法处理它。
我是否以某种方式将枚举包装并分组到一个类中?以某种方式使用 EnumSet?
下面是我想要完成的示例类。虽然,请记住,其中一些实际上只是伪代码,我希望它如何工作以给出这个想法。
具体看下面的Run()方法。
// NOTE: This is not expected to compile.
class PseduocodeTestClass
{
// The idea here is that I would like to have a way to group the enums
// in such a way where they can be selected by the user as such:
// Ex #1: MainGroup.FirstEnumGroup.RED
// Ex #2: MainGroup.SecondEnumGroup.TRUCK
enum MainGroup
{
DUMMY1,
DUMMY2;
enum FirstEnumGroup
{
RED,
GREEN,
BLUE
};
enum SecondEnumGroup
{
CAR,
TRUCK
}
}
// This is what I would like to avoid, multiple method
// calls.
// void processEnum(MainGroup.FirstEnumGroup e)
// {
//
// }
//
// void processEnum(MainGroup.SecondEnumGroup e)
// {
//
// }
//Instead, I would like to have one single method by which I could
//pass different grouped enums to one method.
void processEnum(MainGroup e)
{
int ordinal = 0;
// below is SIMPLY pseduocode on how this could be envisioned to
// be used. I'd like to be able to pull the enum out that was passed
// into this method.
if(e.getClass() == MainGroup.FirstEnumGroup)
{
//again, this doesn't obvioulsy work, but this is just to demonstrate
//the desire to pull the enum out somehow. Either cast it or otherwise.
MainGroup.FirstEnumGroup theSelectedEnum = e.getClass();
ordinal = theSelectedEnum.ordinal();
}
else if(e.getClass() == MainGroup.SecondEnumGroup)
{
MainGroup.SecondEnumGroup theSelectedEnum = e.getClass();
ordinal = theSelectedEnum.ordinal();
}
// DO SOMETHING HERE WITH 'ordinal'.
}
void Run()
{
//Start of with BLUE
MainGroup e = MainGroup.FirstEnumGroup.BLUE;
//First we pass in BLUE from the FirstEnumGroup
processEnum(e);
//select a different enum
e = MainGroup.SecondEnumGroup.TRUCK
//Second we pass in TRUCK from the SecondEnumGroup
processEnum(e);
//Finally, pass in RED
processEnum(MainGroup.FirstEnumGroup.RED);
}
};
不幸的是,我无法找到一种方法来做我想做的事。也许,真的没有办法简单地做到这一点?
【问题讨论】:
-
"...并且,我希望能够调用传递两个单独枚举中的任何一个的方法。" ...最好的方法是做到这一点是让每个枚举类实现一个通用接口,该接口指定枚举组共有的行为契约。如果您的方法被定义为接受接口类型的参数,那么您可以从任何实现该类型的组中传入任何枚举常量。