所以我定义了几个如下所示的枚举。我有一个使用枚举来查找值的方法。
public enum MyEnum1
{
STRING1("My String1"),
STRING2("My String2"),
STRING3("My String3"),
STRINGLESS("String not found");
private String s;
private MyEnum1(String s) { this.s = s; }
public String getValue() { return s; }
}
public enum MyEnum2
{
STRING1("My String1"),
STRING2("My String2"),
STRING3("My String3"),
STRINGLESS("String not found");
private String s;
private MyEnum2(String s) { this.s = s; }
public String getValue() { return s; }
}
public class MyClass1
{
public static String getPlacement(String myString)
{
for (MyEnum1 a: MyEnum1.values())
if (myString.contains(a.toString()))
return a.getValue();
return MyEnum1.STRINGLESS.getValue();
}
}
public class MyClass2
{
public static String getPlacement(String myString)
{
for (MyEnum2 a: MyEnum2.values())
if (myString.contains(a.toString()))
return a.getValue();
return MyEnum2.STRINGLESS.getValue();
}
}
现在我定义了 5 个枚举,它们都由相同的 getPlacement 方法处理,但我必须创建 5 个不同的 MyClass 类(MyClass2、MyClass3...),并在 For 循环中硬编码为 MyEnum2、MyEnum3...让它发生。
我已经尝试过了...
public static String getPlacement(Enum e, String myString) {}
和
public static String getPlacement(Enum<?> e, String myString) {}
但两者都不起作用。
我想将一个枚举作为参数传递给 getPlacement 方法,这样我就可以只有一个 MyClass 类来处理 5 个不同的枚举。这可能吗?
最佳答案
要保留 getPlacement
的确切语义,您可以这样做:
interface StringValue {
String getValue();
}
enum MyEnum1 implements StringValue {
...
private String stringValue;
...
@Override
public String getValue() {
return stringValue;
}
}
static <E extends Enum<E> & StringValue>
String getPlacement(Class<E> enumClass, String inValue) {
for(E constant : enumClass.getEnumConstants()) {
if(inValue.contains(constant.toString()))
return constant.getValue();
}
return Enum.valueOf(enumClass, "STRINGLESS").getValue();
}
我不确定这里的确切语义对您是否真的很重要。如果不是,还有更简单的方法。如果您不需要 contains
您可以使用 Enum#valueOf
。如果您可以覆盖 toString
(因为您也可以使用 Enum#name
),那么您不需要接口(interface)。
而且,就像所有使用枚举的复杂情况一样,如果您不使用枚举,事情可能会简单得多。具有私有(private)构造函数和 public static final 常量的 final
类可以执行许多枚举无法执行的操作(例如从抽象父类(super class)型继承...)。
关于Java 通用枚举作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979440/