从枚举类型获取类实例

时间:2014-12-26 15:14:13

标签: java enums

我有Color枚举:

  1. RED

  2. BLUE

  3. GREEN

  4. 我也有这3个课程:

    1. Red

    2. Blue

    3. Green

    4. 我的Testclass使用属性private Color color并在那里存储一个枚举值。如何在getValue()上调用private Color color或其他内容时返回相应的类对象?

      实施例: 如果我的Testclasscolor = Color.RED,则应在其上调用Red时返回班级getValue()的新实例。

3 个答案:

答案 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.forName(String)

  

返回与具有给定字符串名称的类或接口关联的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
}