情景:
1)我有一个长状态变量,可以设置也可以不设置。
2)此long变量具有从Long.MIN_VALUE到Long.MAX_VALUE的有效值,包括零
3)这是性能敏感的代码,因此我不想使用Long包装器类型
如何在这长时间内编写'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
}
}
}
}
答案 0 :(得分:3)
你必须为NaN留出一个特殊值。如果你真的使用了所有可能的值,那就没有了。
你确定Long对象有很大的性能问题吗?
如果是这样,可能有一个额外的布尔值来表示是否设置了值?
答案 1 :(得分:2)
使用Long而不是long,并使用null作为NaN值。
答案 2 :(得分:1)
很长时间没有NaN
。如果你确定性能很关键(我测试使用Long
的速度惩罚),那么你将需要使用另一个标志值。
答案 3 :(得分:1)
我使用了Long.MIN_VALUE,因为它具有奇怪的属性,如
Long.MIN_VALUE == -Long.MIN_VALUE
它也不太可能自然发生。
使用它的问题是,它可以使代码更复杂。出于这个原因,我使用double
而不是错误地表示小于+/- 2 ^ 53的整数值。