我正在设计一个网页,其中添加变量和变量类型可以是Double
,String
,...
用户必须选择其中一种类型。后端将根据用户定义的类型创建变量。
我正在考虑使用通用枚举来解决这个问题。喜欢;
public enum VariableType<Type> {
Double("Double", Double);
String("String", String);
private String name;
private Type type;
}
使页面加载REST调用/variable/types
从枚举中返回类型列表并填充下拉列表。
当用户根据传递的字符串提交表单时,Type
被关联。
似乎我正在做的事情无效,所以我正在寻找更好的方法来做到这一点,请咨询
答案 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上),添加一个新的抽象方法,你将被迫为你决定支持的每个类型实现它。
希望这有帮助。