Ето примерно решение, тенденциозно доближено до основната функционалност на
enum:
public class ExtensibleEnum {
private java.util.Map<String, Enum> mValues = new
java.util.LinkedHashMap<String,
Enum>();
public ExtensibleEnum(final Enum[] ... pEnums) {
for (final Enum[] iEnum : pEnums) {
for (final Enum e : iEnum) {
if (mValues.put(e.name(), e) != null) {
throw new RuntimeException(e.name() + " already exists.");
}
}
}
}
public Enum get(final String pName) {
return mValues.get(pName);
}
public Enum[] values() {
return mValues.values().toArray(new Enum[mValues.size()]);
}
public Enum valueOf(final Class pEnumType, final String pName) {
final Enum ret = get(pName);
if (! ret.getClass().equals(pEnumType)) {
throw new IllegalArgumentException();
}
return ret;
}
}
Ето как бих направил две псевдо изброявания на числата от 1 до 19 и от 1 до 29:
public class ExtensibleEnumDemo {
enum E1_9 {
ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE
}
enum E10_19 {
TEN, ELEVEN, TWELVE, THIRTEEN, FOURTEEN, FIFTEEN, SIXTEEN, SEVENTEEN,
EIGHTEEN,
NINETEEN
}
enum E20_29 {
TWENTY, TWENTYONE, TWENTYTWO, TWENTYTHREE, TWENTYFOUR, TWENTYFIVE, TWENTYSIX,
TWENTYSEVEN, TWENTYEIGHT, TWENTYNINE
}
static class E1_19 {
private final static ExtensibleEnum smTheEnum = new
ExtensibleEnum(E1_9.values(),
E10_19.values());
public static Enum[] values() {
return smTheEnum.values();
}
}
static class E1_29 {
private final static ExtensibleEnum smTheEnum = new
ExtensibleEnum(E1_9.values(),
E10_19.values(), E20_29.values());
public static Enum[] values() {
return smTheEnum.values();
}
public static Enum valueOf(final Class pEnumType, final String pName) {
return smTheEnum.valueOf(pEnumType, pName);
}
}
public static void main(String[] args) {
demo(E1_9.values());
demo(E10_19.values());
demo(E20_29.values());
demo(E1_19.values());
demo(E1_29.values());
System.out.println(E1_29.valueOf(E10_19.class, E10_19.NINETEEN.name()));
System.out.println(E1_29.valueOf(E1_19.class, E10_19.NINETEEN.name())); //
Error
}
static void demo(final Enum[] pEnum) {
for (final Enum e : pEnum) {
System.out.println(e + ", name()=" + e.name() + ", ordinal()=" +
e.ordinal());
}
System.out.println("--------------------------------------");
}
}
Vladislav Doshev (VladiSD)
ICQ #16292897
________________________________________________________________________________\
____
Tonight's top picks. What will you watch tonight? Preview the hottest shows on
Yahoo! TV.
http://tv.yahoo.com/