将原始数字常量(通常是状态值-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;
if (-1 == status)
if (-1L == status)
if (null!= status && -1L == status) // Explicit null check
if (status == -1) // Does it matter Left/Right in autoboxing?
if (new Long(-1) == status)
if (new Long(-1).equals(status)) // correct, but terrible to read
if (NON_PRIMITIVE.equals(status)) // hypercorrect, really the best?
if (status.equals(new Long(-1)) // not null save
if (PRIMITIVE == status)
if (NON_PRIMITIVE == status) // Correct for cached values only (-128..127)
问题1:
if(-1L == status)
真的安全吗? (忽略null
)
问题2: 什么是比较它的最佳语法null safe?
答案 0 :(得分:0)
if(-1L == status)真的安全吗? (忽略null)
是。 Java将值从-128缓存到127. L
只表示该数字为Long
。
尝试:
System.out.println(1L == 1);
比较它的最佳语法是什么?null safe?
如果我理解正确,不应该
if(something != null)
够了吗?
答案 1 :(得分:0)
status
为null
时,所有四个都会中断。盒装值在哪一方面无关紧要:编译器将生成代码以将其拆箱以进行比较。如果对原始值使用文字或变量也无关紧要。status
已生成valueOf
或自动生成(这是相同的事情)。Long.valueOf
代替new
,和,status
来自自动装箱或使用valueOf
的代码,则第5号可行。 status
没有自动装箱,但是使用new
代替,则会中断。总体而言,NON_PRIMITIVE.equals(status)
是最安全的选择,因为即使在使用status
构建new
的情况下它也能正常工作。