我有一个枚举让我们说enum A { value1, value2, value3}
并且还有一个enum B { value1, value2, value3}
尽管这些枚举具有相似的值,但由于编码标准不同,它们不能互换使用,因为它们位于不同的层中。有没有办法将内容从一个复制到另一个?默认情况下,值没有任何访问说明符,也没有任何类型。他们只是田野。如果有任何方法可以使用java将一个内容复制到其他内容,请告诉我。另请注意,A是第三方枚举,无法修改,B是我试图生成的
答案 0 :(得分:9)
您可以通过名称获取枚举值:
String name = A.value1.name();
try {
B b = B.valueOf(name);
}
catch (IllegalArgumentException e) {
// Handle this if name doesn't exist in B
}
名称只是一个字符串,可以在不同的层之间安全地传输。有关详细信息,请参阅Enum.valueOf(Class<?>, String)
答案 1 :(得分:1)
如果枚举常量的名称相同,您可以使用.name()
方法从一种类型获取字符串,并使用其他类型查找它.valueOf()
方法(根据Lukas Eder的回答。)java.lang.Enum
类定义了通用.valueOf()
,但是当您定义新的enum
时,它也有具有该名称的隐式方法,不需要具体的枚举类型类作为第一个参数 - 这在Javadocs中不是很明显。
如果声明的常量的位置在两个枚举中都对应,则通过.ordinal()
方法获取第一个类型的位置,然后通过另一个类型获取相应的常量.values()[position]
。当你定义一个新的enum
时,它有一个隐式.values()
方法,它按照它们的定义顺序返回数组中的所有常量 - 这在Javadocs中并不是很明显。
我猜这两种方法都可能容易出错,尤其是在添加/更改常量时。您可能不知道第三方枚举已更新,上面会导致难以跟踪的错误,因为隐含了两个枚举类之间的关系,但下一个开发此工作的开发人员可能不知道。
我个人更喜欢:
在您已控制的枚举类型中添加/到翻译方法。明确地为每个常量提供相关的对应常量 - 可能通过使用switch
构造,某些IDE可以自动填充所有需要的case
语句。在default
语句中,抛出异常(或其他检测错误的方法),并提供一条友好的友好消息,告知该方法需要更新。你仍会遇到错误,但至少你可以让发生错误的人更清楚。
这具有明显的优点,即名称和序数位置都不需要对应。如果将枚举值保存到数据库中,这也可能很重要 - 根据所使用的模式,您可能希望控制常量,而第3方代码则不会这样。
在重新阅读您的问题时,似乎您希望通过反射等机制自动使您的enumB与第三方enumA的值保持同步。似乎只允许检查但不在运行时进行修改(参见https://docs.oracle.com/javase/tutorial/reflect/special/enumMembers.html)。根据您的代码,可能会有其他结构填补空白,例如:带有来自第三方enumA的键的地图(您可以在运行时设置/更新)。
编辑:似乎有方法和手段,但它肯定不是标准的Java,因此我个人不想去那里。请参阅http://www.javaspecialists.eu/archive/Issue161.html。