【问题标题】:Grouping of separate enums & a bass enum to reference the group of enums对单独的枚举和一个低音枚举进行分组以引用枚举组
【发布时间】:2016-06-23 08:52:31
【问题描述】:

在 Java 中,我一直在尝试找到一种方法:

  1. 以可以访问的方式对枚举进行分组,例如:MainGroup.FirstEnumGroup.GREEN
  2. 使用分组枚举,有一个可以引用枚举组的基本枚举(有点像低音类)。在下面的示例中,MainGroup 是 2 个单独枚举组的基本枚举。但是,问题是,MainGroup 无法引用 FirstEnumGroupSecondEnumGroup
  3. 能够将枚举组传递给单个方法进行处理。

例如,假设我有两个单独的枚举。而且我希望能够调用传递两个单独枚举中的任何一个的方法。我能看到这个工作的唯一方法是通过两个单独的方法来接收每个单独的枚举。相反,我想找到一种方法来对枚举进行分组并允许用户从组中选择一个枚举,并让一个方法处理它。

我是否以某种方式将枚举包装并分组到一个类中?以某种方式使用 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);

    }

};

不幸的是,我无法找到一种方法来做我想做的事。也许,真的没有办法简单地做到这一点?

【问题讨论】:

标签: java enums grouping base


【解决方案1】:

问题是您试图将 MainGroup.FirstEnumGroup.BLUE 引用为 MainGroup 类型,这是不正确的,因为它的类型是 FirstEnumGroup。 SecondEnumGroup 也是如此。您可以做的是为 FirstEnumGroup 和 SecondEnumGroup 都有一个标记接口,然后返回类型可以是该接口。

类似这样的:

public interface EnumGroupInterface {
}

enum FirstEnumGroup implements EnumGroupInterface {
 ...
}

enum SecondEnumGroup implements EnumGroupInterface {
 ...
}

void Run() {
    EnumGroupInterface e = MainGroup.FirstEnumGroup.BLUE;
    ...
}

void processEnum(EnumGroupInterface e) {
 ...
}

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多