是否有正当理由在Java类似是否有任何合理的理由在Java中的数字类上使用新的构造函数?
Long l = new Long(SOME_CONSTANT)
这将创建一个额外的对象,并通过FindBugs的标记,并且显然是一个不好的做法。我的问题是,是否有充分理由这样做?
我以前asked this about String constructors and got a good answer,但这个答案似乎并不适用于数字。
是否有正当理由在Java类似是否有任何合理的理由在Java中的数字类上使用新的构造函数?
Long l = new Long(SOME_CONSTANT)
这将创建一个额外的对象,并通过FindBugs的标记,并且显然是一个不好的做法。我的问题是,是否有充分理由这样做?
我以前asked this about String constructors and got a good answer,但这个答案似乎并不适用于数字。
只有当你想确保你得到一个独特的实例,所以几乎从来没有。
某些数字可以在自动复制时被缓存(尽管Longs
aren't guaranteed to be),这可能会导致问题。但是任何会因为缓存而破坏的代码可能存在更深层次的问题。现在,我想不出一个有效的案例。
我能想到的唯一的事情就是让拳击明确,虽然相当于autoboxed代码实际上是编译成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等于自动复制的,所以如果你愿意的话,我甚至不会看到你如何做出功能上的区别。
我的问题是有没有充足的理由这样做?
如果您想编写与旧版JRE兼容的代码,您仍然可以使用它。 valueOf(long)仅在Java 1.5中引入,因此在Java 1.4之前以及构造函数是直接从长的到长的唯一方法。我期望它不被弃用,因为构造函数仍然在内部使用。
这确实是一个很好的理由(尽管Java应用程序的百分比仍然在1.4或更低?)。 – 2009-06-17 20:40:54