Java 整数枚举和取消装箱
然后是一个枚举:Java 整数枚举和取消装箱,java,Java,然后是一个枚举: public class Document{ private Integer status; // get()/set() } 在一种方法中,我使用上述方法,如下所示: public enum DocumentStatusEnum { ACTIVE_DOCUMENT(2060),CANCELLED_DOCUMENT(2061),DRAFT_DOCUMENT(2062),PROCESSED_DOCUMENT(2063); p
public class Document{
private Integer status;
// get()/set()
}
在一种方法中,我使用上述方法,如下所示:
public enum DocumentStatusEnum {
ACTIVE_DOCUMENT(2060),CANCELLED_DOCUMENT(2061),DRAFT_DOCUMENT(2062),PROCESSED_DOCUMENT(2063);
private final Integer value;
private DocumentStatusEnum(Integer value){
this.value = value;
}
public Integer getValue(){
return value;
}
}
我在这里明白了。看起来不错。使用相同的方法,在几行之后,我执行以下操作:
Document d = new Document();
d.setStatus(2063);
if (d.getStatus() == DocumentStatusEnum.PROCESSED_DOCUMENT.getValue()){
{
// print true;
}
else{
// print false;
}
我得到一张假照片。我研究并发现了Java中的缓存和装箱特性。我将枚举定义转换为:
d.setStatus(2060)
if (d.getStatus() == DocumentStatusEnum.ACTIVE_DOCUMENT.getValue()){
// print true
}
else{
// print false
}
现在,没有问题了。我在这两种情况下都是正确的
问题是为什么会发生这种情况?我觉得这种行为非常不稳定。这是我正在处理的一个大型应用程序,我到处都在使用
Integer==Integer
比较。我在这里安全吗?整数
扩展了对象
,因此=
被定义为引用相等,而不是值相等
将整数
与整数
进行比较时,整数
将被取消绑定为整数
,并且将比较两个操作数的值是否相等。(除非Integer
值为null
,在这种情况下将抛出NullPointerException
。)但是Integer==Integer
永远都不安全
也就是说,因为默认情况下运行时会为小整数预先分配
Integer
实例(-128到127,根据),所以通常可以让Integer==Integer
为小值工作。但这种行为并不适用于更大的值,也从来没有必要适用。因此,除非您明确寻找引用等式,否则您永远不应假设整数的两个实例(或字符串
,或任何对象
)将使用=
进行比较相等。整数
扩展对象
,因此=
被定义为引用相等,不重视平等
将整数
与整数
进行比较时,整数
将被取消绑定为整数
,并且将比较两个操作数的值是否相等。(除非Integer
值为null
,在这种情况下将抛出NullPointerException
。)但是Integer==Integer
永远都不安全
也就是说,因为默认情况下运行时会为小整数预先分配Integer
实例(-128到127,根据),所以通常可以让Integer==Integer
为小值工作。但这种行为并不适用于更大的值,也从来没有必要适用。因此,除非您显式地寻找引用相等,否则您永远不应该假设整数
(或字符串
,或任何对象
)的两个实例将使用=
进行相等比较。除非您需要处理空值,否则您应该使用int
而不是整数
比较Integer
对象确实存在一些问题。例如,以下值将计算为false:
public enum DocumentStatusEnum {
ACTIVE_DOCUMENT(2060),CANCELLED_DOCUMENT(2061),DRAFT_DOCUMENT(2062),PROCESSED_DOCUMENT(2063);
private final int value;
private DocumentStatusEnum(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
这些只是和其他物体一样的物体。当与对象一起使用时,=
运算符仅当它们是完全相同的Java对象时才计算为true(与equals()
方法相反,该方法可被重写以比较内部结构)。除非需要处理空值,否则应使用int
而不是Integer
比较Integer
对象确实存在一些问题。例如,以下值将计算为false:
public enum DocumentStatusEnum {
ACTIVE_DOCUMENT(2060),CANCELLED_DOCUMENT(2061),DRAFT_DOCUMENT(2062),PROCESSED_DOCUMENT(2063);
private final int value;
private DocumentStatusEnum(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
这些只是和其他物体一样的物体。=
运算符在与对象一起使用时,仅当它们是完全相同的Java对象时才计算为true(与equals()
方法相反,该方法可以被重写以比较内部结构)。装箱/取消装箱行为有明确的规则,但对我来说,行为并不总是清晰的。因此,我禁止在我的项目中进行自动装箱(cab可以设置为像eclipse中的编译器错误一样进行处理)?如果不是,则考虑将其更改为<代码> int >代码>。对于装箱/拆箱行为有干净的规则,但对我来说,行为并不总是清楚的。因此,我禁止在我的项目中进行自动装箱(cab可以设置为像eclipse中的编译器错误一样进行处理)?如果没有,那么考虑将它改为<代码> int <代码> 1。预分配的对象可能会导致一些非常不寻常的结果。+ 1,预先分配的对象可能会导致一些非常不寻常的结果。