如何在Java中呈现可空的原始类型int?

yin*_*uge 32 java nullable

我正在设计一个实体类,它有一个名为"documentYear"的字段,可能有无符号整数值,如1999,2006等.同时,这个字段也可能是"未知",也就是说,不确定文档是哪一年创建.

因此,C#中的可空int类型将非常适合.但是,Java没有像C#那样可以为空的特性.

我有两个选择,但我不喜欢它们:

  1. 使用java.lang.Integer而不是原始类型int;
  2. 使用-1表示"未知"值

有没有人有更好的选择或想法?

更新:我的实体类将有数万个实例; 因此,java.lang.Integer的开销可能对系统的整体性能来说太重了.

Mat*_*nes 32

在这里使用Integer类可能就是你想要做的.与对象相关联的开销很可能(尽管不一定)对应用程序的整体响应性和性能微不足道.


hha*_*fez 27

你将不得不抛弃原始类型或使用一些任意的int值作为你的"无效年份".

负值实际上是一个不错的选择,因为几乎没有机会有一个有效的年份会导致整数溢出并且没有有效的负面年份.

  • @SimonAndréForsberg - 当然,这就是他们对2000年所说的话. (29认同)
  • ...除非您希望能够使用模式表示BC和AD年份.;-) (20认同)
  • 使用0.没有零年,BC或AD. (20认同)
  • 除非你的域是天文数字,否则第0年是有效的. (10认同)
  • 年份2147483647也不太可能,可以用作任意int值. (3认同)

Apo*_*isp 15

成千上万的Integer实例并不是很多.考虑花费几百千字节而不是过早优化.支付正确性是一个很小的代价.

小心使用像null或的标记值0.这基本上等于撒谎,因为0不是一年,而null不是整数.一个常见的错误来源,特别是如果你在某些时候并不是软件的唯一维护者.

考虑使用类型安全的null Option,有时也称为Maybe.在Scala和Haskell等语言中很流行,这就像一个有一个或零个元素的容器.您的字段将具有类型Option<Integer>,该类型将年份字段的可选性质通告给类型系统,并强制其他代码处理可能缺少的年份.

这是一个包含Option类型的库.

以下是您使用它时如何调用代码:

partyLikeIts.setDocumentYear(Option.some(1999));

Option<Integer> y = doc.getDocumentYear();
if (y.isSome())
   // This doc has a year
else
   // This doc has no year

for (Integer year: y) {
  // This code only executed if the document has a year.
}
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,不是一年就是0.但那不是重点.重点是哨兵价值失去意义并打败类型系统. (3认同)