首页 > 解决方案 > Java Enum 将类嵌入到字段中

问题描述

我有一个名为 Country 的 java 枚举类,我有以下代码:

public enum Country {
    
    AFGHANISTAN("Afghanistan","AF","AFG",004, RegionAfghanistan.class),
    ALBANIA("Albania","AL","ALB",8, RegionAlbania.class);
    .......
    Some methods and constructor.
}

所以你可以在最后一个字段中看到我已经将类嵌入到枚举字段中。这些区域中的每一个都是枚举类,如下所示。

public enum RegionAfghanistan {

    BADAKHSHAN("Badakhshān", "AF-BDS*", CountryCategory.PROVINCE),
    BAGHLAN("Baghlān", "AF-BGL*", CountryCategory.PROVINCE),
    BALKH("Balkh", "AF-BAL*", CountryCategory.PROVINCE),
    BADGHIS("Bādghīs", "AF-BDG*", CountryCategory.PROVINCE),
    BAMYAN("Bāmyān", "AF-BAM*", CountryCategory.PROVINCE),
    DAYKUNDI("Dāykundī", "AF-DAY*", CountryCategory.PROVINCE),
    ......
    Some methods and feilds.

现在假设给我区域:Badakhshān 国家:阿富汗作为字符串。首先,我有一种方法,它给了我来自“阿富汗”的 Country.AFGHANISTAN,所以这很好。我还从 Country.AFGHANISTAN 得到一个类,即类 com.****.core.location.RegionAfghanistan 但我想从给定区域“Badakhshān”得到 RegionAfghanistan.BADAKHSHAN。您能否帮助我如何使用 java 枚举来实现这一点。希望你明白我想用这个来实现什么。

我使用了以下代码

Class c = Country.AFGHANISTAN.getRegion(); 
Method methodname = c.getMethod("getRegionAfghanistanBySubdivisionName", String.class); 
System.out.println(methodname.invoke(c, "Badakhshān")); 

我从字符串“阿富汗”得到 Country.AFGHANISTAN,然后我得到类,并在类中调用一个方法,传递区域“Badakhshān”,我得到正确的值,但我不确定我是否以正确的方式或在那里是另一种更好的方法。

如果这是正确的方法或者有更好的方法,我真的需要帮助......非常感谢您的帮助。

标签: javaenums

解决方案


另一种将国家枚举链接到其区域值的方法,您需要改进 getRegions 调用以匹配文本标签而不是我使用的 toUpperCase:

public enum RegionAfghanistan {
    BALKH, BAGHLAN;
}
public enum RegionUK {
    WALES, ENGLAND;
}
public enum Country {
    AFGHANISTAN(RegionAfghanistan.values()),
    UK(RegionUK.values());

    private Enum<?>[] regions;
    <T extends Enum<T>> Country(T[] values) {
        this.regions = values;
    }
    <T extends Enum<T>> T getRegion(String name) {
        return Enum.valueOf((Class<T>) regions[0].getClass(), name.toUpperCase());
    }
}
public static void main(String[] args) {
    System.out.println(Country.AFGHANISTAN.getRegion("Balkh"));
    System.out.println(Country.UK.getRegion("Wales"));
}

推荐阅读