Java:如何创建通用的ENUM类型

时间:2013-01-09 19:07:30

标签: java generics enums

我正在设计一个网页,其中添加变量和变量类型可以是DoubleString,... 用户必须选择其中一种类型。后端将根据用户定义的类型创建变量。

我正在考虑使用通用枚举来解决这个问题。喜欢;

public enum VariableType<Type> {
    Double("Double", Double);
    String("String", String);

    private String name;
    private Type type;
}  

使页面加载REST调用/variable/types从枚举中返回类型列表并填充下拉列表。

当用户根据传递的字符串提交表单时,Type被关联。

似乎我正在做的事情无效,所以我正在寻找更好的方法来做到这一点,请咨询

1 个答案:

答案 0 :(得分:0)

在开始我的回答之前,我想说一个枚举是一个枚举,这是一个有限的命名集合。

某些东西是静态的最终对象。所以

enum MyEnum {A,B,C;}
引擎盖下的内容如下:

static final Object A = new MyEnum();
static final Object B = new MyEnum();
static final Object C = new MyEnum();

所以,既然我认为你对你的枚举有所有可能的类型不感兴趣(最后你有一个固定的组合),我建议你一个试图尽量减少工作量的解决方案,一旦你实现起来可能很简单选择了你想要支持的类型。在我的解决方案中,我选择了Longs,Doubles,Points和Strings

我直接向您提供代码,如果您认为此解决方案符合您的需求,我将很乐意根据您的意见和要求进行改进。

// MyType.java
package stackoverflow.answers;

import java.awt.Point;

public enum MyType {
    LONG {
        @Override
        public Object validateValue(Object o) {
            return (o instanceof Long) ? o : null;
        }

        @Override
        public Object parse(String s) {
            try {
                return Long.valueOf(s);
            } catch (Exception e) {
                return null;
            }

        }
    },
    DOUBLE {
        @Override
        public Object validateValue(Object o) {
            return (o instanceof Double) ? o : null;
        }

        @Override
        public Object parse(String s) {
            try {
                return Double.valueOf(s);
            } catch (Exception e) {
                return null;
            }

        }
    },
    STRING {
        @Override
        public Object validateValue(Object o) {
            return (o instanceof String) ? o : null;
        }

        @Override
        public Object parse(String s) {
            // stupid method, but needed.
            return s;

        }
    },
    AWTPOINT {
        @Override
        public Object validateValue(Object o) {
            return (o instanceof Point) ? o : null;
        }

        @Override
        public Object parse(String s) {
            if (s == null)
                return null;
            String ss[] = s.split(",");
            if (ss.length != 2)
                return null;
            try {
                return new Point(Integer.valueOf(ss[0]), Integer.valueOf(ss[1]));
            } catch (Exception e) {
                return null;
            }

        }
    };

    public String toString(Object o) {
        return o.toString();
    }

    public abstract Object validateValue(Object o);

    public abstract Object parse(String s);
}

然后:

// GenericObject.java
package stackoverflow.answers;

public class GenericObject {

    private MyType _type;
    private Object _obj;

    public GenericObject(MyType type) {
        _type = type;
    }

    public void setValue(Object obj) {
        _obj = _type.validateValue(obj);
    }

    public void valueOf(String s) {
        _obj = _type.parse(s);
    }

    public String toString() {
        return _type.toString(_obj);
    }

}

和测试类:

package stackoverflow.answers;

public class EnumTest {

    public static void main(String[] args) {
        GenericObject o1 = new GenericObject(MyType.LONG);
        o1.setValue(new Long(42));

        GenericObject o2 = new GenericObject(MyType.DOUBLE);
        o2.valueOf("3.14");

        GenericObject o3 = new GenericObject(MyType.AWTPOINT);
        o3.valueOf("4,-30");

        System.out.println(o1);
        System.out.println(o2);
        System.out.println(o3);

    }

}

这个想法很简单,每次你需要支持一个新类型时,添加一个枚举元素。抽象方法将迫使您实现存储,验证和解析(保存db是下一个?)所需的所有值。每次需要一个新函数时(是的,比如保存在db上),添加一个新的抽象方法,你将被迫为你决定支持的每个类型实现它。

希望这有帮助。