在我的应用程序中,如果输入匹配某些特定的20个条目,我需要分支。
我想过使用枚举
public enum dateRule { is_on, is_not_on, is_before,...}
并打开枚举常量来执行函数
switch(dateRule.valueOf(input))
{
case is_on :
case is_not_on :
case is_before :
.
.
.
// function()
break;
}
但输入字符串将类似于'is on','is not on','is before'等,而不是_之间的_。 我了解到枚举不能包含包含空格的常量。
我可以做出的可能方法:
1,使用if语句比较给出长if语句的20个可能输入,如
if(input.equals("is on") ||
input.equals("is not on") ||
input.equals("is before") ...) { // function() }
2,处理输入以在单词之间插入_,但即使是不属于此20的其他输入字符串也可以有多个单词。
有没有更好的方法来实现这个?
答案 0 :(得分:3)
可以从值中分离枚举标识符。像这样:
public enum MyEnumType
{
IS_BEFORE("is before"),
IS_ON("is on"),
IS_NOT_ON("is not on")
public final String value;
MyEnumType(final String value)
{
this.value = value;
}
}
您还可以向枚举类型添加方法(该方法也可以包含参数),如下所示:
public boolean isOnOrNotOn()
{
return (this.value.contentEquals(IS_ON) || this.value.contentEquals(IS_NOT_ON));
}
在开关中使用:
switch(dateRule.valueOf(input))
{
case IS_ON: ...
case IS_NOT_ON: ...
case IS_BEFORE: ...
}
当您获得IS_ON的值时,例如System.out.println(IS_ON)
,它将显示is on
。
答案 1 :(得分:3)
您可以在枚举中定义自己的valueOf
方法版本(只是不要将其称为valueOf
)。
public enum State {
IS_ON,
IS_OFF;
public static State translate(String value) {
return valueOf(value.toUpperCase().replace(' ', '_'));
}
}
只需像以前一样使用它。
State state = State.translate("is on");
早期的switch语句仍然有效。
答案 2 :(得分:1)
如果你正在使用Java 7,你也可以在这里选择中途,并用字符串做switch
语句:
switch (input) {
case "is on":
// do stuff
break;
case "is not on":
// etc
}
答案 3 :(得分:0)
你并没有真正打破这个概念,两种解决方案都很脆弱......
查看语法
“是”,可以删除,似乎无处不在
“不”,可选,申请一个!到输出比较
on,before,after,apply comparison。
所以在空格之间进行分割。解析拆分字以确保它们存在于语法定义中,然后对传入的表达式进行逐步评估。这将允许您轻松扩展语法(无需添加“是”和“不是” “对于每种组合,保持代码易于阅读。
为了切换语句的目的,将多个条件组合成一个条件会导致随着时间推移而出现巨大膨胀。
答案 4 :(得分:0)
感谢您的建议。他们在这里指导我。
这与其他答案几乎相同,只是略微简化。
总而言之,我需要将输入字符串与一组20个字符串和
进行比较如果匹配,就做点什么。否则,做点别的事。
需要比较输入的静态字符串集: 是开启,不开启,是之前,之后等等20个条目
我创建了一个枚举
public enum dateRules
{
is_on
,is_not_on
,is_before
,is_after
.
.
.
}
并打开输入的格式化值
if(isARule(in = input.replace(" ","_"))
{
switch(dateRule.valueOf(in))
{
case is_on,
case is_not_on,
case is_before, ...
}
}
我将'input'的格式化值复制到'in',这样我就可以重复使用输入而无需用''替换'_'。
private static boolean isARule(String value)
{
for(dateRule rule : dateRule.values())
{
if(rule.toString().equals(value))
{
return true;
}
}
return false;
}
问题解决了。