我有一个名为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.
现在假设我被赋予地区:巴达赫什国家:阿富汗作为一根弦。首先,我有一种方法,它给了我Country.AFGHANISTAN从";阿富汗";,所以,这很好。我还从阿富汗国家获得了一个课程,即课程com.***。core.location。region AFGHANISTAN,但我想从给定的地区获得region Afganistan.BADAKHSHAN;Badakhhān";。你能帮助我如何使用java枚举实现这一点吗。希望你能理解我想用这个实现什么。
我使用了以下代码
Class c = Country.AFGHANISTAN.getRegion();
Method methodname = c.getMethod("getRegionAfghanistanBySubdivisionName", String.class);
System.out.println(methodname.invoke(c, "Badakhshān"));
我从字符串"中得到Country.AFGHANISTAN;阿富汗";,然后我得到该类,并在类中调用一个方法;Badakhhān"我得到了正确的价值,但我不确定我是以正确的方式做,还是有其他更好的方法。
如果这是正确的方法,或者有更好的方法,我真的很想得到帮助……非常感谢你的帮助。
您可以向RegionAfghanistan
(和其他区域枚举(添加一个方法,该方法允许您按名称查找区域。它可能看起来像:
public static RegionAfghanistan getByName(String name) {
for (RegionAfghanistan value : values()) {
if (value.name.equals(name)) {
return value;
}
}
throw new IllegalArgumentException("Not a region: " + name);
}
您可以通过反射调用此方法,给定RegionAfghanish:的Class对象
Class<RegionAfghanistan> regionAfghanistanClass = RegionAfghanistan.class;
// Look up method
Method getByName = regionAfghanistanClass.getMethod("getByName", String.class);
// Call it. It's a static method, so pass in "null"
RegionAfghanistan badakhshān = (RegionAfghanistan) getByName.invoke(null, "Badakhshān");
另一种将country enum链接到其regions值的方法,您需要改进getRegions调用以匹配文本标签,而不是我使用的UpperCase:
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"));
}
进行了一点实验,发现您也可以通过使用Region
接口和Country
枚举中的abtral方法来实现。这个设置需要大量重复的代码来告诉它要使用哪个Region
枚举。
区域接口:
public interface Region{}
RegionUSA枚举:
public enum RegionUSA implements Region
{
WASHINGTON, FLORIDA;
}
RegionCanada Enum:
public enum RegionCanada implements Region
{
QUEBEC, ALBERTA;
}
RegionFrance Enum:
public enum RegionFrance implements Region
{
NORMANDY, BERRY;
}
国家/地区枚举:
public enum Country
{
USA
{
@Override
public Region getRegion(String region)
{
return RegionUSA.valueOf(region.toUpperCase());
}
},
CANADA
{
@Override
public Region getRegion(String region)
{
return RegionCanada.valueOf(region.toUpperCase());
}
},
FRANCE
{
@Override
public Region getRegion(String region)
{
return RegionFrance.valueOf(region.toUpperCase());
}
};
public abstract Region getRegion(String region);
}
主要类别:
public class TestEnums
{
public static void main(String[] args)
{
System.out.println(Country.CANADA.getRegion("Alberta"));
System.out.println(Country.USA.getRegion("Washington"));
System.out.println(Country.FRANCE.getRegion("Normandy"));
}
}