使用Arrays.asList检查指定枚举值列表中的int是否为int

时间:2014-11-10 05:34:01

标签: java list enums boxing

我被告知不要执行以下代码并检查使用&&条件以确保resultCode不是以下之一。但我不明白为什么这样做不会奏效。好像应该这样。 HttpStatus返回一个int。 resp.getResultCode()会返回Long

if(!Arrays.asList(HttpStatus.NO_CONTENT.value(), HttpStatus.GONE.value(), HttpStatus.OK.value())
          .contains(resp.getResultCode())){
    // Do things
}

上面有什么问题? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

正如您所说,getResultCode会返回LongHttpStatus.value()会返回int,当您将其java.lang.Integer放入List时会自动加到java.lang.Integer

java.lang.Long永远不等于false,因此您的if语句始终返回long

除了@RichardSchwartz提到的效率原因之外 - 我认为并不是在努力工作。

要使它完全有效,你应该:

  1. 如果getResultCode返回int(小写),则应首先将其转换为.contains((int)resp.getResultCode()))Long
  2. 如果它返回int,您应该以这种方式将其转换为.contains(resp.getResultCode().intValue()))java.lang.Integer.equals
  3. 以下是 public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } 的源代码:

    {{1}}

答案 1 :(得分:0)

您编写它的方式,JVM必须分配内存来实例化一个Array对象,然后填充三个元素。然后它将不得不评估contains方法,它将遍历Array元素。 Array对象的内存(最终)必须进行垃圾回收。这将使您的代码运行效率低于直接方法。

此外,没有其他人能够只看一眼您的代码并立即确切地知道它的含义。

答案 2 :(得分:0)

我可以在您的代码中看到性能问题。您正在不必要地创建列表对象。 Java对象创建是您可以执行的最昂贵的操作。所以,我可以说使用"&&"或"切换案例"并避免在可能的情况下创建对象。