Java 复杂if()或枚举?

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; } 但输入字符串

在我的应用程序中,如果输入匹配某些特定的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”等,在单词之间没有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中,您可以打开一个字符串。从这里开始,进一步简化控制流,最终在我发布的解决方案中结束。我学到了很多。谢谢。:)