繁体   English   中英

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

[英]Proper way testing that String belongs to subset of constants (Java)

目标:

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

初始解决方案:

让我们列出可能的事件。

/**
* 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
  • 测试String keyEvent是否代表已定义的枚举?

2)清单

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


请在回答之前阅读此内容

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

这样的事情怎么样?

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

约翰·弗格斯(John Fergus)发表评论后,可以使用以下类似方法来提高可读性:

    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);
    }

尽管通常首选包含允许值的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM