在Java中使用嵌套的枚举类型

我想到的是一个涉及嵌套枚举的数据结构,因此我可以执行以下操作:

Drink.COFFEE.getGroupName();

Drink.COFFEE.COLUMBIAN.getLabel();

如果有方法声明:

someMethod(Drink type)

someOtherMethod(DrinkTypeInterface type)

然后我可以说(适当):

someMethod(Drink.COFFEE)

someOtherMethod(Drink.COFFEE.COLUMBIAN)

这是我想出的:

public enum Drink {

COFFEE("Coffee");

private String groupName;

private Drink(String groupName) {

this.groupName = groupName;

}

public enum Coffee implements DrinkTypeInterface {

COLUMBIAN("Columbian Blend"),

ETHIOPIAN("Ethiopian Blend");

private String label;

private Coffee(String label) {

this.label = label;

}

public String getLabel() {

return this.label;

}

}

String getGroupName() {

return this.groupName;

}

}

和界面:

public interface DrinkTypeInterface {

public String getLabel();

}

我想我只是想用Java来完成这种事情的最佳方法,或者是否需要编写一堆if语句来处理单个Drink.values()。有什么帮助吗?

回答:

Drink.COFFEE.getGroupName();

Drink.COFFEE.COLUMBIAN.getLabel();

首先,您提供的示例代码在某种程度上违反了“德米特律”-因为COLUMBIAN实例字段仅用于检索标签。同样,通过这种结构,COLUMBIAN 必须

是COFFEE枚举的一个实例,但是我不认为这就是您真正想要的。

someMethod(Drink type)

someOtherMethod(DrinkTypeInterface type)

someMethod(Drink.COFFEE)

someOtherMethod(Drink.COFFEE.COLUMBIAN)

我要从样本中收集的信息是,您想要一个枚举,其中包含实际饮料的“组类型”,然后每种饮料对于特定类型的饮料都有各自的值。您的示例给出了咖啡,但是茶也应该起作用。

问题是您如何放置枚举。正如我之前说过的,您必须使COLUMBIAN成为COFFEE枚举的实例,但这并不是构造此结构的最佳方法。

问题在于您有饮料,然后是咖啡/茶,然后是它们的个人类型。但是,如果您考虑一下,尽管HerbalTea是一种茶,但它也是一种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

现在,如果由于某种原因您不想在一个枚举中喝完所有饮料,那么我就不明白您要干什么。在那种情况下,如果您确实具有跨枚举的功能,则进行单独的Coffee和Tea(以及其他)枚举,然后将接口应用于两个(或多个)枚举。但是,我认为您正在尝试像这样对它们进行分组。

以上是 在Java中使用嵌套的枚举类型 的全部内容, 来源链接: utcz.com/qa/433475.html

回到顶部