Ответ 1
Drink.COFFEE.getGroupName();
Drink.COFFEE.COLUMBIAN.getLabel();
Во-первых, этот примерный код, который вы дали, несколько нарушает "закон demeter" - поскольку поле экземпляра COLUMBIAN используется только для извлечения метки. Кроме того, с этой структурой COLUMBIAN должен быть экземпляром перечисления COFFEE, но я не думаю, что вы действительно собираетесь здесь.
someMethod(Drink type)
someOtherMethod(DrinkTypeInterface type)
someMethod(Drink.COFFEE)
someOtherMethod(Drink.COFFEE.COLUMBIAN)
То, что я собираю из того, что представляет собой ваш образец, состоит в том, что вы хотите иметь перечисление, содержащее "групповой тип" того, что представляет собой настоящий напиток, а затем каждый из них имеет индивидуальные значения для конкретного типа напитка. Ваш пример дает кофе, но Чай должен работать так же хорошо.
Проблема заключается в том, как вы разместили свои перечисления. Как я уже говорил, вам нужно сделать COLUMBIAN ИНСТАНЦИЮ перечисления COFFEE, но это не лучший способ структурировать это.
Проблема в том, что у вас есть напиток, затем кофе/чай, а затем их отдельные типы. Но, если вы думаете об этом, хотя HerbalTea IS A Tea, это также DRINK, поэтому он не является просто экземпляром TEA.
Но, если вы сделаете напиток типичным перечислением и сами по себе, вы получите то, что хотите, и структура станет более понятной. И благодаря интерфейсам и мощности делегирования, как тип напитка, так и переименование напитка могут обрабатываться таким же образом, как и в следующей примерной программе:
public final class DrinkEnumExample {
public interface DrinkTypeInterface {
String getDisplayableType();
}
public static enum DrinkType implements DrinkTypeInterface {
COFFEE("Coffee"), TEA("Tea");
private final String type;
private DrinkType(final String type) {
this.type = type;
}
public String getDisplayableType() {
return type;
}
}
public static enum Drink implements DrinkTypeInterface {
COLUMBIAN("Columbian Blend", DrinkType.COFFEE),
ETHIOPIAN("Ethiopian Blend", DrinkType.COFFEE),
MINT_TEA("Mint", DrinkType.TEA),
HERBAL_TEA("Herbal", DrinkType.TEA),
EARL_GREY("Earl Grey", DrinkType.TEA);
private final String label;
private final DrinkType type;
private Drink(String label, DrinkType type) {
this.label = label;
this.type = type;
}
public String getDisplayableType() {
return type.getDisplayableType();
}
public String getLabel() {
return label;
}
}
public DrinkEnumExample() {
super();
}
public static void main(String[] args) {
System.out.println("All drink types");
for (DrinkType type : DrinkType.values()) {
displayType(type);
System.out.println();
}
System.out.println("All drinks");
for (Drink drink : Drink.values()) {
displayDrink(drink);
System.out.println();
}
}
private static void displayDrink(Drink drink) {
displayType(drink);
System.out.print(" - ");
System.out.print(drink.getLabel());
}
private static void displayType(DrinkTypeInterface displayable) {
System.out.print(displayable.getDisplayableType());
}
}
Выход этой программы выглядит следующим образом:
All drink types
Coffee
Tea
All drinks
Coffee - Columbian Blend
Coffee - Ethiopian Blend
Tea - Mint
Tea - Herbal
Tea - Earl Grey
Теперь, если по какой-то причине вы не хотите, чтобы все ваши напитки были в одном перечне, тогда я не понимал, что вы собираетесь делать. В этом случае, если у вас есть функциональность, которая охватывает перечисления, сделайте отдельные списки кофе и чая (и что угодно) и примените интерфейс для обеих (или более) перечислений. Но, я думаю, вы пытались их группировать следующим образом.