有没有合理的理由在Java中的数字类上使用new和构造函数?
-
06-07-2019 - |
题
有没有合理的理由在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等于自动装帧的,所以如果你愿意的话我甚至无法看到你如何进行功能区分。
不隶属于 StackOverflow