Прежде чем начать мой ответ, я хотел бы сказать, что перечисление - это перечисление, то есть конечные коллекции названного что-то.
Это что-то статические конечные объекты. Так
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 является следующим?) Вашими значениями. Каждый раз, когда вам нужна новая функция (да, например, save on db), добавьте новый абстрактный метод, и вы будете вынуждены реализовать его для каждого типа, который вы решили поддержать.
Надеюсь это поможет.