假设我有以下 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/