2012-04-27 33 views
3

場景:長原始的NaN值想

1)I具有既可以設置或不設置較長的狀態變量。

2)這個長變量從Long.MIN_VALUE到Long.MAX_VALUE有效值包括零

3)這是性能敏感的代碼,所以我不希望使用龍包裝類型

如何我是否會爲此長時間寫一個'is set'檢查?我真的必須添加第二個布爾值來測試這個long是否有效嗎?這似乎馬虎。我知道我可以在這裏使用一個Long包裝器,但是這似乎是一個性能浪費,因爲要創建這麼多的對象並檢查null。

僞代碼(這是那種我想要的):

class foo { 

long someLong = NaN; //NaN = hypothetical not a number like Double 

public reset() { 
    someLong = NaN; 
} 

public doSomethingElse() { 
    if(someLong !=NaN) { 
    //report 
    reset(); 
    } 
} 

public doSomeStuff() { 
    if(someLong == NaN) { 
    someLong = //something 
    } 
} 

} 

} 
+1

任何你不想使用布爾值來設置或不設置的東西的原因? – JAM 2012-04-27 03:46:50

+2

只需使用一個額外的布爾設置/未設置。 – Ryan 2012-04-27 03:47:36

+0

好的,很酷。感謝人口普查。這裏的布爾值似乎是正確的解決方案。我只是認爲它不是最可讀的,並且在其他類型中看到的約定之外(例如,Object:null,double:NaN),但在這種情況下,性能會保證它。 – 2012-04-27 03:52:57

回答

3

您必須爲NaN預留一個特殊值。如果你真的使用了所有可能的值,那麼沒有。

你確定長對象是那麼多的性能問題嗎?

如果是這樣,也許有一個額外的布爾值來表示值是否設置?

+0

'長'具有間接+分配/ GC成本,'value'字段是最終的,在非x86上它需要額外的訂購圍欄。 – bestsss 2012-04-27 09:22:53

1

沒有NaN久。如果您確定性能很關鍵(我會測試使用Long的速度懲罰),那麼您將需要使用另一個標誌值。

1

我用Long.MIN_VALUE其爲奇數屬性,如

Long.MIN_VALUE == -Long.MIN_VALUE 

它也不太可能自然發生。

使用它的問題是,它可能會使代碼更復雜。出於這個原因,我使用double,而不是整數值小於+/- 2^53可以表示沒有錯誤。

2

使用Long而不是long,並使用null作爲NaN值。