假设我有以下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.
有没有办法"约束"有效枚举值的范围,以便人们可以从静态类型系统中受益?
您可能需要考虑使用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()来生成并集、差集和交集(只需记住首先复制左侧集)。