创建"复合枚举"在Java中

时间:2014-05-15 01:39:11

标签: java enums

我试图通过一些棘手的方法来获取复杂的枚举值。让我们说我们有类似的东西:

enum Country
{
    USA, UK;
}

enum Person
{
    ALICIA, BOB, CEDRICK,
    USA_ALICIA, USA_BOB, USA_CEDRICK,
    UK_ALICIA, UK_BOB, UK_CEDRICK;
}

我想有一个简单而简短的机制,比如铸造。如果countryCountry.UK,则(country)Person.BOB应包含值Person.UK_BOB。任何想法如何实现?

编辑:新想法 我没有看到任何其他解决方案,因为来自美国和英国的Alicias不同,它们具有不同的属性。你会怎么说呢?

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

2 个答案:

答案 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
    }
}, ...