Java 复杂if()或枚举?
在我的应用程序中,如果输入匹配某些特定的20个条目,我需要进行分支 我想过使用枚举Java 复杂if()或枚举?,java,enums,Java,Enums,在我的应用程序中,如果输入匹配某些特定的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; } 但输入字符串
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”等,在单词之间没有uu。
我了解到枚举不能有包含空格的常量
我可以找出的可能方法:
1,使用if语句比较20个可能的输入,给出一个长if语句,如
if(input.equals("is on") ||
input.equals("is not on") ||
input.equals("is before") ...) { // function() }
2、处理输入以在单词之间插入uu,但即使其他不属于这20的输入字符串也可能有多个单词
有更好的方法来实现这一点吗?如果您使用的是Java 7,您也可以在这里选择中间路线,并使用字符串执行
switch
语句:
switch (input) {
case "is on":
// do stuff
break;
case "is not on":
// etc
}
你没有真正打破这个概念,两种解决方案都很脆弱 看看你的语法 “是”,可以删除,似乎无处不在 “不”,可选,应用一个!对输出进行比较 在上、之前、之后应用比较 所以在空间之间进行分割。解析拆分的单词以确保它们存在于语法定义中,然后对传入的表达式进行逐步求值。这将允许您轻松地扩展语法(无需为每个组合添加“是”和“不是”),并使代码易于阅读
为了switch语句的目的,将多个条件组合成一个条件会随着时间的推移导致大量膨胀。可以将枚举标识符从值中分离出来。如下所示:
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));
}
您还可以向枚举类型添加方法(该方法也可以有参数),如下所示:
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)
它会显示是开的
,你可以在枚举中定义你自己版本的valueOf
方法(只是不要调用它valueOf
)
像以前一样简单地使用它
State state = State.translate("is on");
前面的switch语句仍然有效。谢谢你的建议。他们在这里指导我 这与其他答案几乎相同,只是有点简化 总之,我需要将输入字符串与一组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;
}
问题解决了
参考:我发现dateRule中的错误
dateRule()无法应用于(java.lang.String)
。IDE建议定义一个构造函数。@学生,那也是我的建议:)很抱歉,我只发布了部分代码。我现在又加了一些。谢谢!现在没有更多错误。:)但是我在System.out.println(is_on)上得到了is_on
@Student您可能需要使用MyEnumType.IS_ON
。是的,我只是这样做的。dateRule.is_on具有值is_on。感谢您提供的信息。肯定会在将来的某个时候帮助我。:)在Java7中,您可以打开一个字符串。从这里开始,进一步简化控制流,最终在我发布的解决方案中结束。我学到了很多。谢谢。:)