2012-04-27 6 views
3

シナリオ:longプリミティブNaN値が必要です

1)長い状態変数が設定されているか設定されていません。

2)この長い変数がゼロ

3を含むLong.MIN_VALUEからはLong.MAX_VALUEに有効な値を持っている)。これは、私はロングラッパー型

方法を使用したくないパフォーマンスに敏感なコードです私はこの長い間、「セットされた」種類のチェックを書いていますか? longが有効かどうかをテストするために2番目のブール値を追加する必要がありますか?これはお粗末なようです。私はここで長いラッパーを使用することができますが、これは非常に多くのオブジェクトを作成し、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

+2

set/notに余分なブール値を使用するだけです。 – Ryan

+0

元気です。国勢調査に感謝します。ここのブール値は適切な解決策のようです。私はそれが最も読みやすいわけではなく、他のタイプ(例えば、Object:null、double:NaN)について見ている国際大会の外だと思うが、この場合はパフォーマンスが保証されている。 –

答えて

3

NaNには特別な値を設定する必要があります。実際にすべての値を使用している場合は、値はありません。

長いオブジェクトはパフォーマンス上の問題が多いですか?

もしそうなら、値が設定されているかどうかを示す余分なブール値を持っている可能性がありますか?

+0

'Long'はインダイレクション+アロケーション/ GCコストを、' value'フィールドはfinalで、非x86では追加のフェンスが必要です。 – bestsss

1

長いためのNaNはありません。パフォーマンスが重要であると確信しているなら(Longを使ってスピード違反をテストする)、別のフラグ値を使いたいと思うでしょう。

1

そのが

Long.MIN_VALUE == -Long.MIN_VALUE 

もその自然に発生する可能性が低いような奇妙な性質を持っているとして、私はLong.MIN_VALUEを使用しています。

使用上の問題は、コードを複雑にすることができることです。この理由から私は代わりにdoubleを使用しました。+/- 2^53より小さい整数値はエラーなしで表現できます。

2

longの代わりにLongを使用し、NaN値としてnullを使用します。

関連する問題