【问题标题】:Getting an enum from an integer + more abstraction questions从整数中获取枚举 + 更多抽象问题
【发布时间】:2021-09-07 20:13:35
【问题描述】:

我有一个枚举器,它接受一个 int 和一个字符串作为字段。这些可以通过静态方法或直接从枚举器“实例”访问(不熟悉此的正确措辞)。这就是我的意思:

public enum CreatureType {

    POKE_PIG(1, "Piggley"), POKE_COW(2, "Cowbert");

    private int number;
    private String name;

    CreatureType(int number, String name) {
        this.number = number;
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }

    public static String getName(CreatureType type) {
        return type.getName();

    }

    public static int getNumber(CreatureType type) {
        return type.getNumber();
    }

但现在我需要从它的 int 中获取一个 CreatureType。所以这是我写的伪代码,这是我对如何做到这一点的最佳猜测:

public static CreatureType getCreatureType(int number) {
    switch (number) {
    case 1:
        return CreatureType.POKE_PIG;
    case 2:
        return CreatureType.POKE_COW;
    default:
        break;
    }
    return null;

}

这感觉很奇怪。我不喜欢这种技术,即使理论上它应该有效,但我觉得必须有更好的方法来做到这一点。我没有将这些枚举存储在列表或集合或任何东西中,所以我无法遍历它们,我只是在寻找正确的方法来获取它。

【问题讨论】:

  • 每个Enum-value 都有一个隐含的int-value,尽管我可以理解在这种情况下不想使用它。 --- 我们可以使用Stream-operations 来获得具有给定numberCreatureTypeArrays.stream(CreatureType.values()).filter(creature -> creature.getNumber() == number).findAny();。这将返回一个Optional<CreatureType>,如果没有找到具有给定编号的生物,则该Optional<CreatureType>为空,否则返回非空Optional

标签: java enums


【解决方案1】:

您的 switch-case 解决方案更高效,但以下代码更易于维护,因为它在添加新枚举值时不需要调整:

public static CreatureType getCreatureType(int number) {
    for(CreatureType creatureType : CreatureType.values()) {
        if(creatureType.number == number) {
            return creatureType;
        }
    }
    return null; // No match.
}

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多