一、问题的起源:一个看似矛盾的建议
在学习和使用Java的过程中,我们经常会听到一个“经验法则”:
“在定义类的成员变量时,推荐使用包装类(如
Integer
),而不是基本数据类型(如int
)。”
当你追问为什么时,一个常见的、但又非常容易引起误解的回答是:“为了防止 NullPointerException
”。
这时,一个敏锐的程序员会立刻发现其中的矛盾:
Integer
作为对象,它的默认值就是null
。如果不对它进行初始化就直接使用,不恰恰是NullPointerException
的直接源头吗?而基本类型int
的默认值是0
,永远不会是null
,怎么看都更“安全”。这到底是为什么?
如果你也有同样的困惑,那么恭喜你,你已经触及到了这个问题的核心。这篇文章将为你彻底厘清这个概念,告诉你这个“经验法则”背后的真正智慧。
二、修正观念:目的不是“防止”,而是“表达”
首先,我们必须纠正那个广为流传但不够精确的说法。推荐使用Integer
的真正目的,不是为了“防止”NPE,而是为了利用null
值来明确地“表达”一种业务状态:『值未设置』或『不存在』。
这是一种思想上的转变:从“避免程序出错”上升到“精确地为业务建模”。
让我们通过一个经典的业务场景来对比一下。
场景:定义一个用户类 User
假设我们需要定义一个User
类,其中包含用户的年龄age
。
方案一:使用基本数据类型 int
public class User {
private int age;
public int getAge() {
return age;
}
public