【问题标题】:How can I pass an enum into a constructor?如何将枚举传递给构造函数?
【发布时间】:2012-10-29 08:44:07
【问题描述】:

我想做这样的事情:

public class MyEnumTest {

    public enum MyEnum;
    private MyEnum value;

    public MyEnumTest(enum e)
    {
        this.MyEnum = e; 
        this.value = this.MyEnum.values[0]//Set value to the first enum value.
    }

    public void setValue(MyEnum e)
    {
        this.value = e; 
    }

    public MyEnum getValue()
    {
        return value;
    }

}

然后这样称呼它:

MyEnumTest car = new MyEnumTest({HONDA, FORD, TOYOTA, HOLDEN}); 
MyEnumTest fruit = new MyEnumTest({APPLE, BANANA, CHERRY}); 

/* some operations occur*/ 

if (car.getValue() == car.FORD) System.out.println("Vrooom!"); 
if (fruit.getValue()) == fruit.APPLE) System.out.println ("Is red and round and delicious"); 

有什么想法吗?

对于奖励分数 - 是否可以使用枚举值设置初始值? 比如像

MyEnumTest myET = new myEnumTest(new enum {RED, GREEN, BLUE, YELLOW}, BLUE); 

【问题讨论】:

  • 您的问题令人困惑——您想专门使用您的MyEnum 还是任何枚举?
  • 我希望能够创建一个类的实例,并使用我想要的任何 Enum 创建它们。

标签: java constructor enums arguments


【解决方案1】:

您可以使用(不带enum 关键字):

public MyEnumTest(MyEnum e)
{
    this.myEnum = e; 
    this.value = MyEnum.values()[0];
}

对于第 2 部分,您可以定义一个重载的构造函数:

public MyEnumTest(MyEnum[] myEnums) {

并使用:

MyEnumTest myET = new MyEnumTest(new MyEnum[] { MyEnum.FOO, ... });

【讨论】:

  • 注意values()是一个静态方法。
  • +1 您可以使用 MyEnum... (varargs) 来隐式创建数组。
【解决方案2】:

正如其他人所说,很难理解您要做什么,但这是我的最佳猜测:

public enum Color {
    RED, GREEN, YELLOW, BLUE;
}


public class MyEnumTest<E extends Enum<E>> {
    private final Class<E> enumType;
    private final E value; 

    public Class<E> getEnumType() {
        return enumType;
    }

    public E getValue() {
        return value;
    }

    public MyEnumTest(Class<E> enumType, E value) {
        this.enumType = enumType;
        this.value = value;
    }

    public MyEnumTest(Class<E> enumType) {
        this(enumType, enumType.getEnumConstants()[0]);
    }

    public static void main(String... args) {
        // no initial value provided
        MyEnumTest<Color> myET = new MyEnumTest<Color>(Color.class);
        if (myET.getValue() == Color.RED) {
            System.out.println("It's probably an apple");
        }

        // providing an initial value
        myET = new MyEnumTest<Color>(Color.class, Color.YELLOW);
        if (myET.getValue() == Color.YELLOW) {
            System.out.println("It's probably a banana");
        }
    }
}

另外,请记住枚举值是静态的......所以,像 myET.MyEnum.RED 这样的东西没有意义......你应该改用:Color.RED

【讨论】:

  • +1 干得好,这采用了我的草图,并且很好地将其塑造成 OP 的表面意图。
【解决方案3】:

很难说你想做什么。 Reimeus 的回答显示了如何处理您的特定 MyEnum 作为论点。如果您想实现您的类以使用任何枚举,请使用以下内容:

public class MyEnumTest<E extends Enum<E>> {

    private final E firstValue;

    public MyEnumTest(Class<E> enumType)
    {
        this.firstValue = enumType.getEnumConstants()[0];
    }

    ...
}

然后像这样实例化它:

MyEnumTest myET = new myEnumTest(MyEnum.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多