【问题标题】:Issue with Switch Case using String Constants initialized from an Enum使用从枚举初始化的字符串常量的 Switch Case 问题
【发布时间】:2018-08-29 06:00:33
【问题描述】:

我的代码中有一个 switch case,它在字符串常量上定义了 case。
如果我将字符串常量初始化为

String INACTIVE = "INACTIVE";  

开关盒工作正常。

但是,如果我使用枚举初始化字符串常量

String INACTIVE = State.INACTIVE.name();

我在 switch case 上得到一个编译时错误

需要常量表达式

我正在使用 MVP 架构,我的 State Enum 只能在 Presenter 中使用,而我的 switch case 在 Activity 视图中。

我不想在视图中复制枚举,记住代码维护问题。

这迫使我为我的 switch 案例单独定义字符串常量,但它不允许我使用 State 枚举值初始化常量。

提前感谢任何有用的建议和解决方案。

【问题讨论】:

  • 能否请您显示枚举实现
  • See here 以及下面的重复链。你不能这样做,但也许你无论如何都不应该这样做。只在 util/static 类的某处定义字符串常量会有什么问题?我的意思是,为什么首先要使用枚举?
  • 这就是Java 的工作原理。 case 只能通过一个常量值,而 Java 无法证明 INACTIVE.name() 将始终返回相同的值。
  • @Zeba 只是切换到枚举,不需要切换到通过枚举检索到的字符串。我的意思是:您可以将每个枚举关联到一个 id(例如,默认情况下是渐进 int),甚至可以使用名称字符串,并在活动之间传递它;然后一旦收到,让枚举类通过给定的整数(或字符串)返回枚举,然后你可以通过枚举进行切换。如果你知道如何使用 Enum,它是一个非常强大的类。

标签: java android enums switch-statement constants


【解决方案1】:

这样做:

public enum State {
    INACTIVE {
        @Override
        public int getId() {
            return 0;
        }
    },
    ACTIVE {
        @Override
        public int getId() {
            return 1;
        }
    },
    CURRENT {
        @Override
        public int getId() {
            return 2;
        }
    };

    public abstract int getId();

    public State getStateById(int id) {
        if (id == 0) {
            return INACTIVE;
        } else if (id == 1) {
            return ACTIVE;
        } else if (id == 2) {
            return CURRENT;
        }
        // this should never happen
        throw new RuntimeException("Shouldn't");
    };
}

所以基本上你使用一个 id 在 Presenter 和 ActivityView 之间传递,然后使用 enum 类本身来解析 id 并检索 enum,你可以直接在 switch case 中使用它。 在我的示例中,我使用 int 只是为了向您展示所有细节,但如果您依赖 getName() 并直接解析 String,则根本不需要覆盖任何方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多