我有Color
枚举:
RED
BLUE
GREEN
我也有这3个课程:
Red
Blue
Green
我的Testclass
使用属性private Color color
并在那里存储一个枚举值。如何在getValue()
上调用private Color color
或其他内容时返回相应的类对象?
实施例:
如果我的Testclass
有color = Color.RED
,则应在其上调用Red
时返回班级getValue()
的新实例。
答案 0 :(得分:3)
您可以将enum
设为工厂。
interface AColour {
};
static class Red implements AColour {
}
static class Green implements AColour {
}
static class Blue implements AColour {
}
enum Colour {
RED {
@Override
AColour makeColour() {
return new Red();
}
},
GREEN {
@Override
AColour makeColour() {
return new Green();
}
},
BLUE {
@Override
AColour makeColour() {
return new Blue();
}
};
abstract AColour makeColour();
}
class TestClass {
Colour colour = Colour.RED;
AColour make() {
return colour.makeColour();
}
}
答案 1 :(得分:1)
我最初向类建议了一个颜色枚举的静态映射,但chrylis在注释中指出,只是为了使它成为一个字段并将其传递给构造函数。
public enum Color {
RED(Red.class),
BLUE(Blue.class),
GREEN(Green.class);
private Class colorClass;
public Color(Class classColor) {
this.colorClass = classColor;
}
public ColorClass getValue() {
return this.colorClass.newInstance();
}
}
答案 2 :(得分:1)
返回与具有给定字符串名称的类或接口关联的
Class
对象。
不要忘记放置目标的完整包名。
然后你应该像这样声明Color
枚举。
public enum Color {
RED("package.Red"),
BLUE("package.Blue"),
GREEN("package.Green");
private final String value;
private Color(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
您可能需要一个特定的实例,而不仅仅是Class
实例。
try {
Class clazz = Class.forName(Color.RED.getValue());
if (clazz.isInstance(Red.class)) {
Red red = (Red)clazz.cast(Red.class);
} else if (clazz.isInstance(Blue.class)) {
Blue blue = (Blue)clazz.cast(Blue.class);
} else if (clazz.isInstance(Green.class)) {
Green green = (Green)clazz.cast(Green.class);
}
} catch (ClassNotFoundException classNotFound) {
// A class named "package.Red" cannot be found
}