Java枚举将类嵌入到feild中

  • 本文关键字:feild 枚举 Java java enums
  • 更新时间 :
  • 英文 :


我有一个名为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"));
}
}

最新更新