枚举的枚举子集

Abd*_*ull 7 java

假设我有以下enum类型:

public enum Country {
    CHINA,
    JAPAN,
    FRANCE,
    // ... and all other countries
    AUSTRIA,
    POLAND;
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建这个枚举的子集,在概念上如下:

public enum EuropeanUnion constraints Country {
    FRANCE,
    // ... and all other countries within the European Union
    AUSTRIA,
    POLAND;
}

public enum LandlockedCountries constraints Country {
    // ... all landlocked countries
    AUSTRIA;
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个enum类型的子集,以便我可以编写诸如的方法

Set<Person> getNationalMembersOfEuropeanParliament(EuropeanUnion euCountry);
Run Code Online (Sandbox Code Playgroud)

使用EuropeanUnion参数的子类型可以euCountry防止API用户意外地传入无效的国家/地区,例如非欧盟国家/地区JAPAN.

有没有办法"约束"有效枚举值的范围,以便人们可以从静态类型系统中受益?

Aas*_*set 4

您可能需要考虑使用EnumSet; 这不会给你新的类型,但它可以让你以集合论的方式处理枚举值的集合:

public enum Country {
    CHINA,
    JAPAN,
    ...;

    public static final EnumSet<Country> EUROPEAN_UNION = EnumSet.of(Country.FRANCE, Country.AUSTRIA, ...);
}
Run Code Online (Sandbox Code Playgroud)

EnumSet实现Set,因此您可以使用 eg addAll(),removeAll()retainAll()来生成并集、差集和交集(只需记住首先复制左侧集)。

  • 可以用“Collections.unmodifyingSet”包装常量以使其不可变。 (2认同)