Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 整数枚举和取消装箱_Java - Fatal编程技术网

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,预先分配的对象可能会导致一些非常不寻常的结果。