Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用从枚举初始化的字符串常量时出现开关大小写问题_Java_Android_Enums_Switch Statement_Constants - Fatal编程技术网

Java 使用从枚举初始化的字符串常量时出现开关大小写问题

Java 使用从枚举初始化的字符串常量时出现开关大小写问题,java,android,enums,switch-statement,constants,Java,Android,Enums,Switch Statement,Constants,我的代码中有一个开关大小写,它在字符串常量上定义大小写。 如果我将字符串常量初始化为 String INACTIVE = "INACTIVE"; 开关箱工作正常 但是,如果我使用枚举作为初始化字符串常量 String INACTIVE = State.INACTIVE.name(); 我得到一个编译时错误的开关情况下说 需要常量表达式 我使用的是MVP体系结构,我的状态枚举只能在演示者中使用,而我的切换案例位于“活动”视图中 考虑到代码维护问题,我不想在视图中复制枚举 这迫使我为我的开关

我的代码中有一个开关大小写,它在字符串常量上定义大小写。
如果我将字符串常量初始化为

String INACTIVE = "INACTIVE";  
开关箱工作正常

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

String INACTIVE = State.INACTIVE.name();
我得到一个编译时错误的开关情况下说

需要常量表达式

我使用的是MVP体系结构,我的状态枚举只能在演示者中使用,而我的切换案例位于“活动”视图中

考虑到代码维护问题,我不想在视图中复制枚举

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

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

这样做:

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案例中使用它。
在我的示例中,我使用int只是为了向您显示所有详细信息,但是如果您依赖getName()并直接解析字符串,则根本不需要覆盖任何方法。

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