当前位置: 首页 > 面试题库 >

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

元阳荣
2023-03-14
问题内容

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

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中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种:

  • 和都是弱类型。 和都是强类型。 我的问题是: 1.和有什么区别吗? 2.选择哪一种?还是?为什么?

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 实际开发中,我们离不开定义常量,当我们需要定义常量时,其中一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 当然这样做简单快捷,缺点是类型是 int ,并且仍然是变量。 那有没有什么好的方法呢? 这时候我们定义一个 class 类型,每个常量都是 class 里面唯一的实例。 正好 Python 提供了 E

  • 我不确定我是否过度工程化了,但我正在考虑创建一个枚举,其中包含一个枚举列表作为它的值,从中我可以得到它的值。 我无法确定枚举的类型,以便正确地将值数组筛选到正确的枚举。例如,我可以用轻松地获得US枚举。我遇到的困难是从该数组中获得正确的值。我尝试比较名称,

  • 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单,缺点是类型是int,并且仍然是变量。 更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能: from enum import Enum