复杂的if()或enum?

时间:2012-06-14 11:37:31

标签: 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;
}

但输入字符串将类似于'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的其他输入字符串也可以有多个单词。

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

5 个答案:

答案 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;
  }

问题解决了。

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