枚举开关语句 Java 6 “默认”情况

4
private enum CLASS {FMAN, SOPH, JUN, SEN, GRAD, ERROR};

private CLASS stringToClass(String t){

    switch(CLASS.valueOf(t))
    {
    case FMAN: return CLASS.FMAN;
    case SOPH: return CLASS.SOPH;
    case JUN: return CLASS.JUN;
    case SEN: return CLASS.SEN;
    case GRAD: return CLASS.GRAD;
    default: 
        System.out.println("NOT VALID CLASS. ERROR");
        return CLASS.ERROR;
    }
}

我有这段代码。在构造过程中,我有一个方法可以从给定的字符串t返回相应的值。

我的问题是,假设"t"最终变成了"CSE"。我该如何处理并返回CLASS.ERROR的值?

顺便说一下,这是Java 6而不是7。


4
将一个枚举称为类...我的大脑炸了。 - Chris Eberle
我知道,我知道。这可能会让人感到困惑。这是我的疏忽导致的不良命名。但是我已经在我的代码中进行了分类。 - Ezrb3zr
如果 t 最终变成了“CSE”,因为 CLASS.CSE 不存在,它不会像预期的那样返回 CLASS.ERROR,而是会出现一个错误,显示 CLASS.CSE 不存在。 - Ezrb3zr
2
如何处理?使用 try-catch 代码块来处理错误。 - Luiggi Mendoza
就像我所说的,由于CLASS.CSE不存在,它只会停止正在进行的操作。 - Ezrb3zr
2个回答

6
这是更好的书写方式:
private CLASS stringToClass(String t){
    try {
        return CLASS.valueOf(t);
    } catch (InvalidArgumentException ex) {
        return CLASS.ERROR;
    }
}

switch语句是多余的...实际上会使您的代码更加脆弱,因为如果您向枚举添加新值,就必须记得更新case列表。


我还应该指出你代码中的几个问题:

  • 将一个枚举称为“CLASS”非常误导人。
  • 你使用了错误的标识符类型。所有类型名称都应该使用驼峰命名法书写,并以大写字母开头。(缩写可以被视为例外情况,但CLASS不是缩写。)

我知道,我知道。这可能令人困惑。是我糟糕的命名。但我的代码中已经有了分类。

是的...好吧,把它改成其他东西。发挥你的想象力。但不要违反样式规则。


1
我同意StevenC的答案,但我会:
  • 将枚举重命名为更符合风格的名称
  • 将方法合并到枚举中
  • 将方法重命名,使其在枚举类名称的上下文中有意义
  • 将异常参数命名为ignore(表示忽略的惯用方式)
  • 从方法中去掉限定的枚举类名称

保留以下内容:

private enum ClassLevel {
    FMAN, SOPH, JUN, SEN, GRAD, ERROR;

    static ClassLevel parseString(String t) {
        try {
            return valueOf(t);
        } catch (InvalidArgumentException ignore) {
            return ERROR;
        }
    }
}

parseString 应该声明返回 ClassLevel - Genzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接