我试图通过一些棘手的方法来获取复杂的枚举值。让我们说我们有类似的东西:
enum Country
{
USA, UK;
}
enum Person
{
ALICIA, BOB, CEDRICK,
USA_ALICIA, USA_BOB, USA_CEDRICK,
UK_ALICIA, UK_BOB, UK_CEDRICK;
}
我想有一个简单而简短的机制,比如铸造。如果country
为Country.UK
,则(country)Person.BOB
应包含值Person.UK_BOB
。任何想法如何实现?
enum Country { USA, UK; } enum Person { ALICIA, BOB, CEDRICK, USA_ALICIA, USA_BOB, USA_CEDRICK, UK_ALICIA, UK_BOB, UK_CEDRICK; public Person from (Country country) { return Person.valueOf (country.toString ().toUpperCase () + "_" + this.toString ().toUpperCase ()); } } // and the usage: Person.BOB.from(country);
答案 0 :(得分:2)
我认为你在enum
这里过火了。考虑这些事实:世界各国可以而且确实会改变,随着时间的推移它们的属性(边界,人口,许多事物)也会发生变化。此外,您的人员列表可能会随着时间的推移而发生变化,您不太可能希望在真实世界的应用程序中硬编码的人员列表。因此,这两种数据似乎都不适合enum
。当你学习编程时,这是一个容易陷入的陷阱。 (好吧,无论如何,这对我来说。)
更多问题,Country
显然是Person
的属性,因此应该是一个实例变量。即使您忽略了关于使用enum
的建议,也是如此。这是两种截然不同的数据。您可以使用Person
数据来使用Country
数据,这是不合逻辑的,因此投射{{{{{}}是不合理的。 1}}成Person
。
因此,请使用实例数据(可能至少是名称)创建这两个类,并使Country
具有Person
的实例变量。
答案 1 :(得分:0)
您可以为每个常量添加和覆盖enum
方法,该常量为特定国家/地区提供enum
值
public Person forCountry(Country country) {
return SomePersonConstant;
}
例如,对于BOB
,
BOB {
@Override
public Person forCountry(Country country) {
if (country == UK)
return UK_BOB;
return BOB; // or other default value
}
}, ...