正确测试String属于常量子集(Java)

时间:2016-08-29 15:10:31

标签: java string enums subset

目标:

  • 表示从抽象类
  • 中定义的字符串创建的字符串子集
  • 测试输入上的字符串是否属于给定子集

初始解决方案:

让我们列出可能的事件。

/**
* List of events.
*/
public abstract class EventKeys {

     public static final String KEY_EVENT_1 = "EVENT_1";
     public static final String KEY_EVENT_2 = "EVENT_2";
     public static final String KEY_EVENT_3 = "EVENT_3";
     public static final String KEY_EVENT_4 = "EVENT_4";
     public static final String KEY_EVENT_5 = "EVENT_5";
     public static final String KEY_EVENT_6 = "EVENT_6";
     public static final String KEY_EVENT_7 = "EVENT_7";
     //etc ..
}

我希望将这些事件的子集作为事件1,3,5,并且只有这些事件允许一些操作。目标是make方法boolean isEventAllowed(String eventKey),它将说明事件是否属于允许事件的子集。

真正天真的做法是:

/**
* Allow only events 1,3,5
*/
private isEventAllowed(String eventKey) {

    if(eventKey.equals(EventKeys1.KEY_EVENT_1)) {
        return true;
    } else if(eventKey.equals(EventKeys1.KEY_EVENT_3)) {
        return true;
    }  else if(eventKey.equals(EventKeys1.KEY_EVENT_3)) {
        return true; 
    } else {
        return false;
    }
}

我觉得这种方法不太方便。我需要更好的方法来表示字符串的子集并提供动作,输入字符串是否属于已定义的子集?

其他可能的解决方案:
作为其他选择,我正在考虑其他两个选项,但我仍然不确定它是否有好的方法。 1)枚举 - 创建字符串枚举

  • 输入枚举:EventKeys1.KEY_EVENT_1,EventKeys1.KEY_EVENT_2,EventKeys1.KEY_EVENT_3
  • 测试是否将key keyEvent belon定义为enum?

2)列表

  • 创建列表List<String> subset然后放在那里 EventKeys1.KEY_EVENT_1,EventKeys1.KEY_EVENT_2,EventKeys1.KEY_EVENT_3
  • 测试String keyEvent是否属于列表子集


请在回答之前阅读

  • 类给出EventKeys,不能更改,主要选项集
  • 我需要以某种方式表示子集
  • 我需要建议更好地实现方法isAllowedEvent(String keyEvent),如果输入字符串则返回true 属于已定义的子集

2 个答案:

答案 0 :(得分:2)

这样的事情怎么样?

    private boolean isEventAllowed(String eventKey) {
      return Arrays.asList(KEY_EVENT_1, KEY_EVENT_3, KEY_EVENT_5).contains(eventKey);
    }

在John Fergus&#39;之后,可读性可以得到改善。使用类似的东西评论:

    private static List<String> SUBSET = Arrays.asList(KEY_EVENT_1, KEY_EVENT_3, KEY_EVENT_5);

    private boolean isEventAllowed(String eventKey) {
      return SUBSET.contains(eventKey);
    }

答案 1 :(得分:0)

虽然保持允许值的Set通常是首选选项,但您可能会注意到原始代码的语法改进,因为它们的一般模式也适用于其他情况。

这样的陈述
if(condition1)
    action;
else if(condition2)
    /* (same) */ action;
…

是多余的,可以用

代替
if(condition1 || condition2)
    action;
…

类似地

if(condition)
    return true;
else
    return false;

是多余的,可能(或甚至应该)被

取代
return condition;

将两者放在一起,您的原始代码就变为

private boolean isEventAllowed(String eventKey) {
    return eventKey.equals(EventKeys1.KEY_EVENT_1)
        || eventKey.equals(EventKeys1.KEY_EVENT_3)
        || eventKey.equals(EventKeys1.KEY_EVENT_5);
}

或者,您可以使用switch声明:

private boolean isEventAllowed(String eventKey) {
    switch(eventKey) {
        case EventKeys1.KEY_EVENT_1:
        case EventKeys1.KEY_EVENT_3:
        case EventKeys1.KEY_EVENT_5:
            return true;
        default:
            return false;
    }
}

不是每个人都喜欢这种编码风格,但这更像是项目或公司政策的问题。有这种情况,这样的switch陈述仍然是最干净的解决方案。与if语句甚至Set方法相比的一个优点是,如果您错误地将相同的常量命名为两次而不是预期的常量(典型的复制和粘贴错误),编译器将立即喊出来,就像您一样在您使用if而非预期KEY_EVENT_3的第三个KEY_EVENT_5语句中...