枚举和通用常量特定方法

时间:2010-10-22 00:47:27

标签: java enums

我有一个类似的枚举:

    enum TEST {
        TEST1, TEST 2;

        public abstract <T> String stringify (T input);
    }

我需要添加一个常量特定的方法,比如stringify。

此方法将采用不同类型的输入(对于每个枚举)。我能这样做吗? Eclipse不允许我这样做..像:

enum TEST {
    TEST1(
       public <Float> String stringify (Float input){
          return String.valueOf(input);
        }
    )
}

5 个答案:

答案 0 :(得分:3)

您无法使用enum执行此操作,但您可以使用泛型类来模拟此行为:

public abstract class TEST<T> {
    public static final TEST<Float> TEST1 = new TEST<Float>() {
        public String stringify (Float input){   
            return String.valueOf(input);   
        }
    };

    public abstract <T> String stringify(T input);
}

答案 1 :(得分:2)

你可以做到。但目前尚不清楚它的好处是什么:

enum TEST {
    TEST1 {
        public <Float>String stringify(Float input) {
            System.out.println("TEST1");
            return String.valueOf(input);
        }
    },
    TEST2 {
        public <Integer>String stringify(Integer input) {
            System.out.println("TEST2");
            return String.valueOf(input);
        }
    },
    TEST3 {};
    public <T>String stringify(T input) {
        System.out.println("super");
        return "";
    }
    public <Integer>String stringify2(Object input) {
        System.out.println("non generic");
        return String.valueOf(input);
    }
}
public class Main{
    public static void main(String[] args) {
        for(TEST test:TEST.values()) {
            System.out.println(test.stringify(new Float(1.23)));
            System.out.println(test.stringify(new Integer(42)));
            System.out.println(test.stringify(new Double(4.56)));
        }
        for(TEST test:TEST.values()) {
            System.out.println(test.stringify2(new Float(1.23)));
            System.out.println(test.stringify2(new Integer(42)));
            System.out.println(test.stringify2(new Double(4.56)));
        }
    }
}

答案 2 :(得分:0)

将每个Enum值视为一个类。所以,是的,枚举可以有方法,就像类一样 - 它们都有相同的方法。

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

看看Planet的例子。

另请注意,枚举本身可以有静态方法....(就像一个类)

答案 3 :(得分:0)

不,你不能让每个枚举常量实现一个抽象方法,但需要一个不同于其他枚举常量的输入类型。如果可以的话,如果您获得了TEST枚举的实例(您不知道它是什么常量)并尝试在其上调用stringify,会发生什么?你会通过什么类型的?

编辑:鉴于您对用于将字符串解码为对象的这些枚举所说的话,在我看来,您有几种选择:

  • 只需在其上调用String即可获得每个已解码对象的toString()个表示。
  • 您可以在枚举类本身上添加一组重载的静态方法,称为stringify(Float)stringify(Double)等。然后您可以调用TEST.stringify(value)并且如果有stringify 1}}值的类型的方法,它工作正常。

我想还有其他选择。

答案 4 :(得分:0)

你不能在枚举中使用泛型,因为枚举常量本身已经是具体(单例)实例。在实例层面,泛型必须已具体化 所以,我会建议选择其他答案中给出的替代方案之一。

如果必须在枚举中执行此操作,则可以考虑以下内容,这至少为您提供了类型检查的运行时方法,包括ClassCastExceptions。但是你不会得到编译器的任何支持。

public enum TestEnum {
    Test1(Float.class),
    Test2(Integer.class),
    Test3(String.class);

    private final Class<?> iInputType;

    private TestEnum(final Class<?> pInputType) {
        iInputType = pInputType;
    }

    public Class<?> getInputType() {
        return iInputType;
    }

    public String stringify(final Object pInput) {
        return String.valueOf(iInputType.cast(pInput));
    }
}

测试代码:

System.out.println(TestEnum.Test1.stringify(1.23f));
System.out.println(TestEnum.Test2.stringify(42));
System.out.println(TestEnum.Test3.stringify("foo"));
// but:
// System.out.println(TestEnum.Test1.stringify("foo")); // -> ClassCastException!

for (TestEnum test : TestEnum.values()) {
    for (Object input : new Object[]{1.23f, 42, "foo"}) {
        if (test.getInputType().isAssignableFrom(input.getClass())) {
            System.out.println(test.stringify(input));
        }
    }
}