0

目前我有一堂课叫TestEnum. 在我的main方法中,我可以使用firstEnum也不secondEnum需要指定firstEnum属于GroupAsecondEnum属于的内容GroupB- 中的代码TestEnum对此进行了排序。

假设其中一个firstEnumsecondEnum可能与三个 中的任何一个相关联SubGrouping enum。我希望能够从我的main方法中建立这种关联。很明显,我不能使用与 with 相同的方法,Grouping因为GroupAis assigned to firstEnumfrom within TestEnum

public enum TestEnum {
    firstEnum (Grouping.GroupA),
    secondEnum (Grouping.GroupB);


    private Grouping group;
    TestEnum(Grouping group) {
        this.group = group;
    } 

    public enum Grouping {
        GroupA, GroupB;
    }
    public enum SubGrouping {
        SubGroup1, SubGroup2, SubGroup3;
    }
}

我该怎么做呢?更具体地说,最好构造一个对象,例如:

TestEnum enumWithinMainMethod = TestEnum.firstEnum(SubGrouping.SubGroup1)

这个实例的期望行为是它同时属于SubGroup1GroupA。然后从这样的实例中,拥有该功能会很好,例如:

switch(enumWithinMainMethod) {
    case firstEnum:
        // Do something associated with firstEnum
    case secondEnum:
        // Do something associated with secondEnum
    default:
        // ...
}
4

2 回答 2

0

在采用这种方法之前,请三思。枚举的目标是静态的、恒定的并且具有有限的值集。您在这里所做的是使 Enum 不再恒定(因为您在运行时更改/初始化它)。

我相信还有其他方法可以做,例如,审查是否真的需要在运行时确定关系?不能在编译时定义吗?您可能还拥有一个 TestEnum-to-SubGroup 映射,而不是动态构造 TestEnum 的内容。

无论如何,虽然它不是可取的,但在 Java 中它在技术上是可行的。

当然,您不能将枚举的“构造”延迟到您的 main() 逻辑之前,但是您可以正常构造枚举,并更改内部状态。

// Mind the naming convention
public enum TestEnum {
    FIRST_ENUM(Grouping.GROUP_A),
    SECOND_ENUM (Grouping.GROUP_B);


    private Grouping group;
    private SubGrouping subGrouping;

    TestEnum(Grouping group) {
        this.group = group;
    } 

    public void setSubGrouping(SubGrouping subGrouping) {
        this.subGrouping = subGrouping;
    }

    public enum Grouping {
        GROUP_A, GROUP_B
    }

    public enum SubGrouping {
        SUB_GROUP_1, SUB_GROUP_2, SUB_GROUP_3;
    }
}

然后在你的main(),做类似的事情

TestEnum.FIRST_ENUM.setSubGrouping(TestEnum.SubGrouping.SUB_GROUP_1);
TestEnum.SECOND_ENUM.setSubGrouping(TestEnum.SubGrouping.SUB_GROUP_2);

通过这样做,您可以在您的main()

再一次,这是不可取的。

于 2013-10-31T04:01:36.463 回答
-1

您不能enumenum. 您可以使用一个类来获得这种行为。

这样的事情怎么样?(泛型不是必需的,但它确实为Groupable类打开了多种类型的分组。)

public enum Grouping { GroupA, GroupB; }
public enum SubGrouping { SubGroup1, SubGroup2, SubGroup3; }
public class SubGroupable<G extends Enum<G>,S extends Enum<S>> {
    private G mainGroup;
    private S subGroup;
    public Groupable(G group, S subGroup) {
        this.mainGroup = group;
        this.subGroup = subGroup;
    }
    public G getGroup() { return mainGroup; }
    public S getSubGroup() { return subGroup; }
}

用法

SubGroupable<Grouping, SubGrouping> g 
        = new SubGroupable<>(Grouping.GroupA, SubGrouping.SubGroup2);
switch (g.getGroup()) {
case Grouping.GroupA: 
    //
    break;
case Grouping.GroupB:
    //
    break;
}

您还可以创建两个最终分组:

public final Grouping FIRST_GROUP = Grouping.GroupA;
public final Grouping SECOND_GROUP = Grouping.GroupB;

这样你就可以在你的case块中使用这些常量。

switch (g.getGroup()) {
case FIRST_GROUPING: // etc
}
于 2013-10-31T03:12:08.270 回答