4

直接将原始值分配给 Wrapper 类型和使用 valueOf API 有什么区别?IE

Long val = 91l;

Long val = Long.valueOf(91l);

这个问题源于我几天来一直在研究的一个错误。到目前为止,我还无法成功地重新创建它,并且会随机出现。我有一些对象是作为处理某些数据的一部分而生成的,这些对象有许多字段,其中一些是 Long 类型(包装器)我确信值被分配给所有变量,但在某些情况下它们只是出现 NULL,即使没有理由这样做。

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

我很想知道我提到的上述两种方法是否存在理论上的差异。(我通常大部分时间都使用第一个。)

4

1 回答 1

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

于 2012-04-23T06:02:47.883 回答