2012-04-23 49 views
4

将原始值直接分配给包装类型并使用valueOf API有什么区别?即将原始值分配给包装类的正确方法

Long val = 91l; 

Long val = Long.valueOf(91l); 

这个问题是从我一直在打破我的头数天的错误。到目前为止,我还没有能够成功地重新创建它,并且会随机出现。我有一些对象是作为处理一些数据的一部分而生成的,这些对象有许多字段,其中一些是Long(Wrapper)类型的。我确信值正被分配给所有变量,但在某些情况下,它们只是即使没有理由,也会出现NULL。

这个问题相关的方式是,这些Long属性的Set方法实际上使用long(primitive)类型的参数,并使用第一种方法分配。我不确定这是否会导致它。我已经用第二种方法修改了我的代码,并且在我开始修复它之前,我正在等待一些好的测试来完成。

我很想知道在我提到的上述2种方法中是否有任何理论上的差异。 (我通常在大多数时间使用第一个。)

回答

8

这两行将编译成相同的字节码(至少在我见过的所有编译器中)。目前还不清楚你的问题在哪里,但它不在那里。 (它不是通过该值是如何创建规范保证,但结果是保证是一个对象,使得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而非l源代码作为后缀 - l可能看起来很像1,具体取决于您的字体。)

相关问题