4

プリミティブ値を Wrapper 型に直接割り当てることと、valueOf API を使用することの違いは何ですか? すなわち

Long val = 91l;

Long val = Long.valueOf(91l);

この質問は、私が何日も頭を悩ませてきたバグから生じています。これまでのところ、正常に再作成できず、ランダムに表示されます。一部のデータの処理の一環として生成されるオブジェクトがいくつかあります。これらのオブジェクトには多数のフィールドがあり、そのうちのいくつかは Long (Wrapper) 型です。すべての変数に値が割り当てられていると確信していますが、場合によっては、単にその理由がない場合でも、NULL が出てきます。

この質問に関連する方法は、これらの Long 属性の Set メソッドが実際には long (プリミティブ) 型の引数を取り、最初のアプローチを使用して割り当てられたということです。それが原因であるかどうかはわかりません。私は 2 番目の方法でコードを修正しました。修正に満足する前に、適切なテストが完了するのを待っています。

私が言及した上記の2つの方法に理論的な違いがあるかどうか知りたい. (私は通常、ほとんどの場合最初のものを使用します。)

4

1 に答える 1

8

これらの 2 行は、同じバイトコードにコンパイルされます (少なくとも、私が見たすべてのコンパイラで)。問題がどこにあるかは明確ではありませんが、そこにはありません。(値がどのように作成されるかは仕様では保証されていませんが、結果は、longValue()メソッドが元のプリミティブ値を返すようなオブジェクトであることが保証されています。)

たとえば、このメソッドを逆コンパイルします。

static void foo() {
    Long val1 = 91L;
    Long val2 = Long.valueOf(91L);
}

最終的には:

static void foo();
  Code:
   0:   ldc2_w  #2; //long 91l
   3:   invokestatic    #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
   6:   astore_0
   7:   ldc2_w  #2; //long 91l
   10:  invokestatic    #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
   13:  astore_1
   14:  return    
}

(ささいな点として、ソースコードでLはなく接尾辞として使用することをお勧めします-フォントによっては非常に似ている場合があります。)ll1

于 2012-04-23T06:02:47.883 に答える