我应该永远不要再使用基元类型吗?

2022-09-03 05:12:09

在Java中混合使用基元数据类型及其各自的包装类会导致很多错误。以下示例说明了此问题:

int i = 4;
...
if (i == 10)
  doStuff();

稍后,您认为您希望变量 i 是已定义或未定义的,因此您将上述实例化更改为:

Integer i = null;

现在,相等性检查失败。

始终使用原始包装类是好的Java实践吗?它显然会尽早解决一些错误,但是这样做的缺点是什么?它是否会影响性能或应用程序的内存占用量?有什么偷偷摸摸的陷阱吗?


答案 1

使用盒装类型确实存在性能和内存问题。

在进行比较时(例如),java必须在进行比较之前取消对类型的框。即使使用方法调用,也比 == 语法更昂贵且 (IMO) 更丑陋。(i == 10)i.equals(TEN)

在内存中,对象必须存储在堆上(这也会影响性能)以及存储值本身。

一个偷偷摸摸的陷阱? 当 i 是 .i.equals(j)null

我总是使用原语,除非它可能是,但在这些情况下,总是在比较之前检查。nullnull


答案 2

首先,从使用基元切换到使用对象只是为了获得将其设置为 null 的能力可能是一个糟糕的设计决策。我经常和我的同事争论空值是否是哨兵值,我的观点通常是它不是(因此不应该像哨兵值那样被禁止),但是在这种特殊情况下,你会不厌其烦地将其用作哨兵值。请不要。创建一个指示整数是否有效的布尔值,或创建一个将布尔值和整数包装在一起的新类型。

通常,当使用较新版本的Java时,我发现我不需要显式创建或转换为基元的对象版本,因为在1.5中添加了自动装箱支持(可能是1.5本身)。