带有Enum变量的Java switch-case“需要常量表达式”错误

v8wbuo2f  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(116)

我有这个枚举:

public enum Pebble {
    RAGE(NamedTextColor.DARK_RED, "Rage Wave", "Channel Rage"),
    FLEET(NamedTextColor.AQUA, "Dash", "Speed Surge"),
    CHARISMA(NamedTextColor.GREEN, "Charisma Aura", "Silver Tongue"),
    STEALTH(NamedTextColor.DARK_PURPLE, "Flashbang", "Smoke Bomb"),
    MOLTEN(NamedTextColor.GOLD, "Fireball", "Flame Touch"),
    STEEL(NamedTextColor.DARK_GRAY, "Iron Skin", "Steel Buddy"),
    ROLL(NamedTextColor.YELLOW, "", "");

    public final NamedTextColor color;
    public final String primary;
    public final String secondary;

    Pebble(@NotNull NamedTextColor color, @NotNull String primary, @NotNull String secondary) {
        this.color = color;
        this.primary = primary;
        this.secondary = secondary;
    }
}

我需要使用primary和secondary字符串来使用这个switch-case语句获得不同的输出:

switch(abilityName) {
    case Pebble.RAGE.primary -> {...}
    case Pebble.RAGE.secondary -> {...}
    ...
}

但是因为这些值在编译时没有初始化为常量,所以我得到一个错误。
我看到一个帖子,建议在枚举中添加这样的东西:

public static Pebble byName(String abilityName) {
    for (Pebble value : values()) {
        if(value.primary.equals(abilityName) || value.secondary.equals(abilityName)) {
            return value;
        }
    }
    return null;
}

然后对于开关的情况你可以这样做:

Pebble pebble = Pebble.byName(abilityName);
switch (pebble) {
    case RAGE -> {...}
    case FLEET -> {...}
    ...
}

但这对我不起作用,因为我需要每个卵石2个不同的输出。
无论我怎么绞尽脑汁也想不出一个好的解决办法,有什么建议吗?

7tofc5zh

7tofc5zh1#

可能有更好的方法来设计对象。
这里有一个替代方案。

  • "...我看到一个帖子,建议将这样的东西添加到枚举中...*
  • ...但这对我不起作用,因为我需要每个Pebble有2个不同的输出。..."*

然后,创建两个方法,其中一个返回 Pebble,并给出单独的评估。

static Pebble primary(String abilityName) {
    for (Pebble pebble : values()) {
        if (pebble.primary.equals(abilityName)) return pebble;
    }
    return null;
}

static Pebble secondary(String abilityName) {
    for (Pebble pebble : values()) {
        if (pebble.secondary.equals(abilityName)) return pebble;
    }
    return null;
}

然后,只要检查它是哪一个 * 卵石 *,第一。

Pebble pebble;
if ((pebble = Pebble.primary(abilityName)) != null) {
    switch (pebble) {
        case RAGE -> { }
        case FLEET -> { }
        case CHARISMA -> { }
        case STEALTH -> { }
        case MOLTEN -> { }
        case STEEL -> { }
        case ROLL -> { }
    }
} else if ((pebble = Pebble.secondary(abilityName)) != null) {
    switch (pebble) {
        case RAGE -> { }
        case FLEET -> { }
        case CHARISMA -> { }
        case STEALTH -> { }
        case MOLTEN -> { }
        case STEEL -> { }
        case ROLL -> { }
    }
}

相关问题