java - 类型化的枚举子集

标签 java

假设我有以下 enum 类型:

public enum Country {
    CHINA,
    JAPAN,
    FRANCE,
    // ... and all other countries
    AUSTRIA,
    POLAND;
}

现在我要创建这个枚举的一个子集,概念上是这样的:

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;
}

我想创建一个 enum 类型的子集,这样我就可以编写如下方法

Set<Person> getNationalMembersOfEuropeanParliament(EuropeanUnion euCountry);

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

是否有任何方法可以“限制”有效枚举值的范围,以便可以从静态类型系统中受益?

最佳答案

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

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

    public static final EnumSet<Country> EUROPEAN_UNION = EnumSet.of(Country.FRANCE, Country.AUSTRIA, ...);
}

EnumSet 实现了 Set,因此您可以使用例如addAll()removeAll()retainAll() 生成并集、差集和交集(只记得复制左边的-先设置一边)。

关于java - 类型化的枚举子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193529/

相关文章:

java - 如何通过 apache poi 在 xlsx 中写入非常大的数字

java - 防止 Unicode 字节顺序标记写入文件中间

java - 导入和导出到 NAVision

java - 我的条件声明有问题

java - Spring集成MessageQueue无需轮询

java - 使用 GSON 和 RETROFIT 反序列化复杂的 JSON 对象

java - 如何在 Minecraft Forge for Minecraft 1.15 中将对象转换为 INBT 类型的 nbt

java - 使用 Java Streams 按属性将对象列表组合在一起,并将它们缩减为具有另一个属性平均值的新对象列表

java - 将轮类时间转换并打印为营业时间

java - 背包式算法