【问题标题】:Can I avoid multiple if-else statements in this case?在这种情况下,我可以避免使用多个 if-else 语句吗?
【发布时间】:2014-08-02 04:46:37
【问题描述】:

处理这段代码的更好方法是什么

我有一个方法如下图,它会接受一个参数 i String 并返回一个 int 值

下面的代码可以正常工作。

public static int getLoggerLevel(String level)
 {
        int loglevel = 3;
        if (level.equals("INFO")) {
            loglevel = 3;
        }
        else if (level.equals("ERROR")) {
            loglevel = 4;
        } else if (level.equals("FATAL")) {
            loglevel = 5;
        }

        return loglevel;

}

我想把键值放在 Map 中,然后根据 String 检索它,但我不想创建一个 Map 我猜这会消耗内存

【问题讨论】:

  • 真的,真的,真的记忆力有限吗?具有三个值的地图不会占用太多内存...
  • 环境真的是那个内存受限,你不能使用Java的基本结构吗?如果是这样,即使使用 Java 而不是使用产生更多内存紧凑类型的语言(如 C),是否有好处?
  • 你有什么进展吗?

标签: java


【解决方案1】:

假设 Java 7:

public static int getLoggerLevel(String level)
{
        switch(level){
            case "ERROR": return 4;
            case "FATAL": return 5;
            case "INFO": 
            default: return 3;
        }
}

一般来说,您可能应该使用enum 而不是字符串来处理这类事情。这是一个完美的契合。此外,它也适用于 Java 6。


这是使用枚举的替代解决方案:

public enum SeverityLevel {
    ERROR, FATAL, INFO
}

 public static int getLoggerLevel(SeverityLevel level)
 {
     switch(level){
          case ERROR: return 4; 
          case FATAL: return 5; 
          case INFO: 
          default: return 3;
     }
 }

它们周围没有引号,它们是枚举值,这种方法还可以减轻由输入错误引起的错误。不过,最大的好处是概念性的,getLoggerLevel 现在接受 SeverityLevel 而不是字符串。

【讨论】:

  • Java 6 的兼容性被高估了,因为它已经报废了。 ;-)(现在,如果您正在为 Android 编写代码,那就另当别论了。)
  • @ChrisJester-Young 完全正确。我认为 Java 6 兼容性并不是在这里使用 ENUM(而不是字符串)的更有力的论据。枚举是为这类事情设计的。从概念上讲,记录器级别不是字符串,它们是记录器级别:)(另外,Brian 所说的)
  • @ChrisJester-Young 你不在现实世界中工作,是吗? ;) 有些公司仍在使用 1.5 (或更低的 ::crnge:: )
  • @BrianRoach 我意识到(在工作中,我们才刚刚完成向 Java 7 的切换)。但我的立场与 Guava 相同,即“我们不会支持使用 1.5 或更低版本的人”。 ;-)(好吧,Guava 实际上确实有一个特殊的 1.5 兼容分支。但它仍然是二等公民。:-P)
  • 值得注意的是,字符串和枚举的 switch 语句会在 null 值上抛出异常。
【解决方案2】:

地图可以工作并且几乎不会消耗任何内存,尤其是在适当的范围内以使其只创建一次时。

【讨论】:

    【解决方案3】:

    使用 Switch-case 简单易读。

    public static int getLoggerLevel(String level)
    {
        switch(level){
            case "ERROR": return 4;
            case "FATAL": return 5;
            case "INFO": 
            default: return 3;
        }
    }
    

    此外,在您的代码中,您可以避免第一个 if 块。 一旦你找到正确的匹配......使用 return 那里将避免检查进一步的代码。 这将使您的代码如下

    public static int getLoggerLevel(String level)
    {
        int loglevel = 3;
        if (level.equals("ERROR")) {
            return 4;
        } else if (level.equals("FATAL")) {
            return 5;
        }
        return loglevel;
    

    }

    【讨论】:

    • 不是我,但可能是因为这个答案是后来发布的,并且没有提供对已经存在的答案的见解。
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2023-03-06
    • 2021-07-03
    • 1970-01-01
    • 2023-03-24
    • 2019-08-24
    • 2011-05-08
    相关资源
    最近更新 更多