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;
}
私はここで真実になります。大丈夫そうです。同じ方法で、数行後、次のようにします。
d.setStatus(2060)
if (d.getStatus() == DocumentStatusEnum.ACTIVE_DOCUMENT.getValue()){
// print true
}
else{
// print false
}
私は偽を取得します。Java のキャッシング機能とボクシング機能について調べたところ、何かが見つかりました。列挙型定義を次のように変換しました。
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;
}
}
今、問題はありません。どちらの場合も真実になります。
質問は、なぜこれが起こっているのですか?この動作は非常に不安定だと思います。これは私が扱っている大規模なアプリケーションであり、Integer == Integer
あらゆる場所で比較を使用しています。私はここで安全ですか?