Вы не можете наследовать перечисление от другого перечисления, хотя вы можете сделать так, чтобы ваше перечисление реализовало интерфейс.Техническая проблема (все перечисления неявно расширяют java.lang.Enum
, поэтому они не могут расширять другой класс, реализуют только дополнительные интерфейсы) не случайна:
По большей части расширяемость перечислений оказываетсябыть плохой идеей.Это сбивает с толку, что элементы типа расширения являются экземплярами базового типа, а не наоборот.Нет хорошего способа перечислить все элементы базового типа и его расширения.Наконец, расширяемость усложнила бы многие аспекты проектирования и реализации.
Из Effective Java 2nd Edition , Item 34.
Однако я не полностьюПонимаете вашу проблему: разве вы не использовали values()
для перебора вашего перечисления?Тогда вам не нужно беспокоиться о расширении вашего перечисления новыми значениями.
Пожалуйста, уточните, что означает "сломанный".
Обновление: , так что вам нужноиметь разные наборы полос для разных типов звезд - это можно реализовать с помощью различных перечислений, расширяющих общий интерфейс, например:
interface Band {
String getName();
void doStuff();
...
}
enum BandsVI implements Band {
V, I;
public String getName() { return toString(); }
public void doStuff() { /* do stuff as appropriate for these bands */ }
...
}
enum BandsJHK implements Band {
J, H, K;
public String getName() { return toString(); }
public void doStuff() { /* do stuff as appropriate for these bands */ }
...
}
И вы можете использовать их, сделав свой класс Star универсальным:
class Star<T extends Enum<T> & Band> {
private Class<T> bandType;
public Star(Class<T> bandType) { this.bandType = bandType; }
public void printBandNames() {
for (Band b : bandType.getEnumConstants())
System.out.println(b.getName());
}
public void doStuffOnAllBands() {
for (Band b : bandType.getEnumConstants())
b.doStuff();
}
}
...
Star<BandsVI> star1 = new Star<BandsVI>(BandsVI.class);
Star<BandsJHK> star2 = new Star<BandsJHK>(BandsJHK.class);
star1.printBandNames(); // prints V I
star2.printBandNames(); // prints J H K
Это хорошо работает, если группы организованы в отдельные группы.Однако, если есть звезды со смешанными группами полос, вы можете предпочесть альтернативный подход:
class Star {
private List<? extends Band> bandTypes;
public Star(List<? extends Band> bandTypes) { this.bandTypes = bandTypes; }
public void printBandNames() {
for (Band b : bandTypes)
System.out.println(b.getName());
}
...
}
...
Star star1 = new Star(Arrays.asList(BandsVI.values()));
Star star3 = new Star(Arrays.asList(new Band[]{BandsVI.V, BandsVI.I, BandsJHK.K}));
...
Это позволяет вам создавать звезды с произвольным смешением полос.Тем не менее, таким образом вы не можете использовать EnumSet
или EnumMap
на диапазонах.