是否有正當理由在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