【问题标题】:How search in java enum?如何在java枚举中搜索?
【发布时间】:2011-10-31 17:22:40
【问题描述】:

我有一组常量,例如:

public static final String CONST1="abc";
public static final String CONST2="cde";
public static final String CONST3="ftr";
...................................
public static final String CONSTN="zya";

在应用程序中,我需要检查某个值是否在某些常量集中,例如:

if (String val in [CONST1,CONST2,CONST3]) {
do something;}
else {
....

枚举可以做到这一点吗?还是使用集合或数组更好? 谢谢。

【问题讨论】:

    标签: java enums constants enumeration


    【解决方案1】:

    你需要的是Enum.valueOf()

    返回指定枚举类型的枚举常量 指定的名称。该名称必须与用于 在这种类型中声明一个枚举常量。 (多余的空格 不允许使用字符。)

    这是我在使用 Enums 时通常会做的一个示例,并且可能会输入“坏”数据。

    public class EnumTest
    {
        public static void main(final String[] args)
        {
            final Option o = Option.safeValueOf(args[0]);
            switch(o)
            {
                case CHOICE_A: // fall through
                case CHOICE_B: // fall through
                case CHOICE_C: // fall through
                    System.out.format("You selected %s", o );
                    break;
                case CHOICE_D:
                    System.out.format("You selected %s", o);
                    break;
                default:
                    System.out.format("Default Choice is %s", o );
            }
        }
    
        public enum Option
        {
            UNRECOGNIZED_CHOICE, CHOICE_A, CHOICE_B, CHOICE_C;
    
            // this hides the Exception handling code
            // so you don't litter your code with try/catch blocks
            Option safeValueOf(final String s)
            {
                try
                {
                    return Option.valueOf(s);
                }
                catch (final IllegalArgumentException e)
                {
                    return UNRECOGNIZED_CHOICE;
                }
            }
        }
    }
    

    您还可以将 Option.values() 中的值的 Array 转换为 EnumSet 并搜索它们并避免可能的 Exception 的开销,如果您认为它会获取大量错误数据。

    【讨论】:

    • 很好的回应。涵盖各个方面,写得很好。
    【解决方案2】:

    您可以按照@Dims 的建议在 switch 语句中使用枚举:

    switch (val) {
        case CONST1: case CONST2: case CONST3:
            do_something();
        break;
        case CONST4:
            do_something_else();
        break;
        default:
            // we should not be here?!?
        break;
    }
    

    我假设val 是一个枚举。您可以按照@jarrod-roberson 的建议创建它:

        val = MyEnum.valueOf(stringValue);        
    

    【讨论】:

    • 如果stringValue 可能不是枚举值之一,请务必将valueOf() 包装在try-catch 中。另请注意,如果这种情况经常发生,您将花费大量时间构建 Exception 对象并通过 try-catch 机制。
    【解决方案3】:

    查看 java.util.EnumSet - 它是针对枚举优化的特殊 Set 实现。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多