4

设想:

1)我有一个可以设置或不设置的长状态变量。

2) 这个长变量具有从 Long.MIN_VALUE 到 Long.MAX_VALUE 的有效值,包括零

3)这是性能敏感代码,所以我不想使用 Long 包装器类型

我该如何写这么长的“已设置”类型的检查?我真的需要添加第二个布尔值来测试 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

4 回答 4

3

您必须为 NaN 留出一个特殊值。如果您真的使用所有可能的值,则没有。

你确定 Long 对象是一个性能问题吗?

如果是这样,可能有一个额外的布尔值来表示该值是否已设置?

于 2012-04-27T03:46:03.277 回答
3

使用 Long 而不是 long,并使用 null 作为 NaN 值。

于 2012-04-27T06:59:00.687 回答
1

NaN很久没有了。如果您确定性能至关重要(我会测试使用 a 的速度损失Long),那么您将需要使用另一个标志值。

于 2012-04-27T03:44:43.957 回答
1

我用过 Long.MIN_VALUE 因为它有奇怪的属性,比如

Long.MIN_VALUE == -Long.MIN_VALUE

它也不太可能自然发生。

使用它的问题是,它可以使代码更复杂。出于这个原因,我使用double小于 +/- 2^53 的整数值来表示可以没有错误。

于 2012-04-27T05:44:42.573 回答