目标:
初始解决方案:
让我们列出可能的事件。
/**
* 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
请在回答之前阅读:
答案 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
语句中...