想要长原始的NaN值

时间:2012-04-27 03:42:13

标签: java null primitive

情景:

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
  }
}

}

}

4 个答案:

答案 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的整数值。