Drink.COFFEE.getGroupName();
Drink.COFFEE.COLUMBIAN.getLabel();
首先,您提供的示例代码在某种程度上违反了“demeter 定律”——因为 COLUMBIAN 实例字段仅用于检索标签。此外,使用这种结构,COLUMBIAN 必须是 COFFEE 枚举的一个实例,但我认为这不是你真正想要的。
someMethod(Drink type)
someOtherMethod(DrinkTypeInterface type)
someMethod(Drink.COFFEE)
someOtherMethod(Drink.COFFEE.COLUMBIAN)
我从您的样本中收集到的是,您希望有一个枚举,其中包含实际饮料的“组类型”,然后每个人都有特定饮料类型的单独值。您的示例给出了 Coffee,但 Tea 应该也可以。
问题在于您如何放置枚举。正如我之前所说,您必须让 COLUMBIAN 成为 COFFEE 枚举的实例,但这并不是构建它的最佳方式。
问题是你有饮料,然后是咖啡/茶,然后是它们各自的类型。
但是,如果你仔细想想,虽然 HerbalTea 是一种茶,但它也是一种饮料 - 所以它不属于简单的 TEA 实例。
但是,如果您将饮料 type 本身设置为枚举,您将得到您想要的,并且结构变得更加清晰。并且由于接口和委托的力量,饮料类型和饮料枚举都可以以相同的方式处理,如以下示例程序:
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
那么,如果由于某种原因你不想在一个枚举中所有的饮料,那么我不明白你想要什么。在这种情况下,如果您确实具有跨越枚举的功能,请制作单独的 Coffee 和 Tea(以及其他)枚举并将接口应用于两个(或更多)枚举。但是,我认为您试图将它们分组。