将数值常量(例如-1L)与==运算符进行比较是否安全?

时间:2015-01-12 12:46:27

标签: java

将原始数字常量(通常是状态值-1,0,1 ...)与比较运算符“==”(以及< =,> =)进行比较是否安全?这样做的最佳语法是什么?性能怎么样?取一下java不可变对象缓存(-128 ... 127)... 请不要回答:“总是使用.equals()”。它比这更复杂。是的,它可以以“.equals()”结束,但我希望听到更深入的分析。另外,我知道应该枚举这样的状态值。但现实生活告诉我们很多API使用数字。感谢。

典型的情况可能是:非原始状态出现“public Long getStatus(){...}”并且需要与一些基本值(正,零,小状态值ONE,TWO, ...)。

Long status = response.getStatus(); final static Long NON_PRIMITIVE = new Long(-1); final static long PRIMITIVE = -1L;

  1. if (-1 == status)
  2. if (-1L == status)
  3. if (null!= status && -1L == status) // Explicit null check
  4. if (status == -1) // Does it matter Left/Right in autoboxing?
  5. if (new Long(-1) == status)
  6. if (new Long(-1).equals(status)) // correct, but terrible to read
  7. if (NON_PRIMITIVE.equals(status)) // hypercorrect, really the best?
  8. if (status.equals(new Long(-1)) // not null save
  9. if (PRIMITIVE == status)
  10. if (NON_PRIMITIVE == status) // Correct for cached values only (-128..127)
  11. 问题1: if(-1L == status)真的安全吗? (忽略null

    问题2: 什么是比较它的最佳语法null safe?

2 个答案:

答案 0 :(得分:0)

  

if(-1L == status)真的安全吗? (忽略null)

是。 Java将值从-128缓存到127. L只表示该数字为Long

尝试:

System.out.println(1L == 1);
  

比较它的最佳语法是什么?null safe?

如果我理解正确,不应该

if(something != null)

够了吗?

答案 1 :(得分:0)

  • 数字1,2,4和10是等价的;由于自动取消装箱,statusnull时,所有四个都会中断。盒装值在哪一方面无关紧要:编译器将生成代码以将其拆箱以进行比较。如果对原始值使用文字或变量也无关紧要。
  • 数字3是安全的,假设status已生成valueOf或自动生成(这是相同的事情)。
  • 如果您使用Long.valueOf代替newstatus来自自动装箱或使用valueOf的代码,则第5号可行。
  • 数字6到8是正确的,但很长
  • 9号是最快的选择,但不是最安全的选择。如果status没有自动装箱,但是使用new代替,则会中断。

总体而言,NON_PRIMITIVE.equals(status)是最安全的选择,因为即使在使用status构建new的情况下它也能正常工作。