[英]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)枚举-创建字符串枚举
2)清单
List<String> subset
然后将EventKeys1.KEY_EVENT_1,EventKeys1.KEY_EVENT_2,EventKeys1.KEY_EVENT_3放在此处
请在回答之前阅读此内容 :
这样的事情怎么样?
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.