5

在我的应用程序中,如果输入匹配某些特定的 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 语句比较 20 个可能的输入,这些输入给出一个长的 if 语句,如

if(input.equals("is on") ||
   input.equals("is not on") || 
   input.equals("is before") ...)   { // function() }

2,处理输入以在单词之间插入_,但即使其他不属于这20个的输入字符串也可以有多个单词。

有没有更好的方法来实现这一点?

4

5 回答 5

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.

于 2012-06-14T11:43:55.433 回答
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 语句仍然有效。

于 2012-06-14T11:44:52.750 回答
1

如果你使用的是 Java 7,你也可以在这里选择中间道路,switch用 Strings 做一个语句:

switch (input) {
    case "is on":
        // do stuff
        break;
    case "is not on":
        // etc
}
于 2012-06-14T11:42:08.460 回答
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;
  }

问题解决了。

参考:https ://stackoverflow.com/a/4936895/1297564

于 2012-06-15T05:53:54.673 回答
0

你并没有真正打破这个概念,这两种解决方案都很脆弱......

看看你的语法

“是”,可以去掉,似乎无处不在

"not",可选,应用 ! 到输出比较

on, before, after, 应用比较。

所以在空格之间进行拆分。解析拆分词以确保它们存在于语法定义中,然后对传入的表达式进行逐步评估。这将允许您轻松扩展语法(无需添加“is”和“is not " 用于每个组合并保持您的代码易于阅读。

为了 switch 语句的目的,将多个条件合并为一个会导致随着时间的推移而出现巨大的膨胀。

于 2012-06-14T11:42:32.267 回答