英文:
Java Enum embed the class in the feild
问题
public enum Country {
AFGHANISTAN("Afghanistan", "AF", "AFG", 004, RegionAfghanistan.class),
ALBANIA("Albania", "AL", "ALB", 8, RegionAlbania.class);
// Other enum values and methods.
}
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),
// Other enum values and methods.
}
Class c = Country.AFGHANISTAN.getRegion();
Method methodname = c.getMethod("valueOf", String.class);
Object result = methodname.invoke(null, "BADAKHSHAN");
System.out.println(result);
The code you provided is mostly correct. However, there's a small change needed when invoking the method to get the RegionAfghanistan
enum value by its name. You should use the valueOf
method to achieve this. The modified code snippet above demonstrates how to do it.
In this code, you first obtain the RegionAfghanistan
class from the Country.AFGHANISTAN
enum, then you use the getMethod
to get the valueOf
method by name. Finally, you invoke this method with the enum value name (in this case, "BADAKHSHAN") to obtain the corresponding RegionAfghanistan
enum value.
英文:
I have one java enum class called Country for which I have below code :
public enum Country {
AFGHANISTAN("Afghanistan","AF","AFG",004, RegionAfghanistan.class),
ALBANIA("Albania","AL","ALB",8, RegionAlbania.class);
.......
Some methods and constructor.
}
So you can see in the last field I have embedded the class in the enum fields. Each of these region is enum class as below.
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.
Now Suppose I am given Region: Badakhshān Country: Afghanistan as a String. First I have method which gives me Country.AFGHANISTAN from the "Afghanistan", So that, is fine.
I also get a class from the Country.AFGHANISTAN i.e. class com.****.core.location.RegionAfghanistan but I would like to get RegionAfghanistan.BADAKHSHAN from the given region "Badakhshān".
Could you please help me how to achieve this using the java enums. Hope you understand what I want to achieve using this.
I have used the following code
Class c = Country.AFGHANISTAN.getRegion();
Method methodname = c.getMethod("getRegionAfghanistanBySubdivisionName", String.class);
System.out.println(methodname.invoke(c, "Badakhshān"));
I get Country.AFGHANISTAN from string "Afghanistan", then I get the class and I invoke a method in class passing the region "Badakhshān" and I get the right value but I am not sure if I am doing it the right way or there is another better way to do it.
I would really want a help if this is right approach or there is better way to do it....Thank you so much for your help.
答案1
得分: 2
public static RegionAfghanistan getByName(String name) {
for (RegionAfghanistan value : values()) {
if (value.name.equals(name)) {
return value;
}
}
throw new IllegalArgumentException("Not a region: " + name);
}
You can call this method via reflection given the Class object for RegionAfghanistan:
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");
英文:
You could add a method to the RegionAfghanistan
(and other region enumerations) that lets you look up a region by its name. It could look like:
public static RegionAfghanistan getByName(String name) {
for (RegionAfghanistan value : values()) {
if (value.name.equals(name)) {
return value;
}
}
throw new IllegalArgumentException("Not a region: " + name);
}
You can call this method via reflection given the Class object for RegionAfghanistan:
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");
答案2
得分: 2
Here is the translated code section:
另一种方法是将国家枚举与其地区值关联起来,您需要改进 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"));
}
Please note that I have retained the original code structure and formatting while providing the translated code.
英文:
Another approach which links country enum to its regions values, you would need to improve getRegions call to match on the text labels rather than toUpperCase I used:
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"));
}
答案3
得分: 1
Experimented a bit, and figured out you can also do it by using a Region
interface and an abstract method in the Country
enum. This setup requires a lot of repeated code to tell it which Region
enum to use though.
Region interface:
public interface Region{}
RegionUSA Enum:
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;
}
Country Enum:
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);
}
Main Class:
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"));
}
}
英文:
Experimented a bit, and figured out you can also do it by using a Region
interface and a abtract method in the Country
enum. This setup requires a lot of repeated code to tell it which Region
enum to use though.
Region interface:
public interface Region{}
RegionUSA Enum:
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;
}
Country Enum:
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);
}
Main Class:
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"));
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论