有没有合理的理由在Java中使用

Long l = new Long(SOME_CONSTANT)

这会创建一个额外的对象并被FindBugs标记,这显然是一种不好的做法。我的问题是,是否有充分的理由这样做?

我以前询问有关字符串构造函数的信息得到了一个很好的答案,但答案似乎并不适用于数字。

有帮助吗?

解决方案

只有当你想确保获得一个独特的实例时,几乎才会这样。

自动装箱时可以缓存某些数字(尽管 Longs 不保证是),这可能会导致问题。但是任何因缓存而破坏的代码都可能存在更深层次的问题。现在,我想不出一个有效的案例。

其他提示

  

我的问题是,是否有充分理由这样做?

如果要编写与旧JRE兼容的代码,您仍可以使用它。 valueOf(long)仅在Java 1.5中引入,因此在 Java 1.4 和构造函数之前是直接从 long Long 的唯一方法。我希望它不会被弃用,因为构造函数仍在内部使用。

我唯一能想到的就是使拳击显式化,虽然等效的自动代码实际编译成Long.valueOf(SOME_CONSTANT),它可以缓存小值:(来自jvm src)

   public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
  }

。没什么大不了的,但是我不喜欢看到代码不断包装和拆箱而不考虑类型,这可能会变得草率。

但从功能上讲,我看不出这种或那种方式的差异。新的long仍然会计算为等于和hashcode等于自动装帧的,所以如果你愿意的话我甚至无法看到你如何进行功能区分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top