如何指定枚举构造函数



目前我有一个名为TestEnum的类。在我的main方法中,我可以处理firstEnumsecondEnum,而无需指定firstEnum属于GroupAsecondEnum属于GroupB - TestEnum中的代码对此进行了排序。

假设firstEnumsecondEnum可以与三个SubGrouping enum中的任何一个相关联。我希望能够从我的main方法中进行这种关联。很明显,我不能使用与Grouping相同的方法,因为GroupA是从TestEnum内部分配给firstEnum的。

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)

此实例的所需行为是它既属于SubGroup1也属于GroupA。那么从这样的实例中,最好具有该功能,例如:

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

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

我相信还有其他方法可以做,例如,审查是否真的需要在运行时确定关系?不能在编译时定义吗? 您还可以使用TestEnum到子组的映射,而不是动态构造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()中定义枚举的子组

再一次,这是不可取的。

不能从enum外部调用enum构造函数。您可以使用类来获取此行为。

像这样的事情怎么样?(泛型不是必需的,但它确实将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
}

最新更新