我正在设计一个实体类,它有一个名为"documentYear“的字段,该字段可能具有无符号整数值,例如1999年、2006年等。同时,该字段也可能是”未知“的,即不确定文档创建的年份。
因此,可空的int类型(如C# )非常适合。但是,Java没有C#那样的可空特性。
我有两种选择,但我不喜欢这两种:
java.lang.Integer
代替原语类型int
;有没有人有更好的选择或想法?
更新:我的实体类将有数以万计的实例;因此,java.lang.Integer的开销对于系统的总体性能来说可能太重了。
发布于 2009-06-11 21:36:25
您将不得不放弃原语类型,或者使用一些任意的int值作为“无效年份”。
负值实际上是一个很好的选择,因为有一个有效年份的可能性很小,这会导致整数溢出,并且没有有效的负年份。
发布于 2009-06-11 21:32:46
在这里使用Integer类可能是您想要做的。与对象相关的开销对应用程序的总体响应性和性能来说很可能(虽然不一定)微不足道。
发布于 2009-06-11 22:15:48
数以万计的Integer实例并不多。考虑花费几百千字节,而不是过早地优化。为了正确起见,这是一个小小的代价。
小心使用哨兵值,如null
或0
。这基本上等同于说谎,因为0
不是一年,而null
也不是整数。一个常见的bug来源,特别是当你不是软件的唯一维护者的时候。
考虑使用类似于Option
的类型安全null,有时称为Maybe
。在Scala和Haskell这样的语言中很流行,这就像一个包含一个或零个元素的容器。您的字段将具有类型Option<Integer>
,它向类型系统宣传您的年份字段的可选性质,并强制其他代码处理可能缺少的年份。
如果您正在使用代码,下面是如何调用代码:
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.
}
https://stackoverflow.com/questions/985151
复制相似问题