装箱变量永远不为空¶
ID: java/non-null-boxed-variable
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- readability
- types
Query suites:
- java-security-and-quality.qls
在 Java 中,所有基本类型都有对应的装箱类型。装箱类型是对象,因此可以为 null
,而基本类型永远不能为 null
。基本类型和装箱类型的名称相似,只是基本类型以小写字母开头,而装箱类型以大写字母开头(此外,对于 char
和 int
,装箱类型的名称稍长,即 Character
和 Integer
)。
因为名称非常相似,并且 Java 执行自动装箱和拆箱转换,所以它们很容易混淆。此外,在应该使用基本类型的地方使用装箱类型会导致可读性问题,并可能导致不必要的对象分配。
建议¶
如果一个变量永远不会被赋值为 null
,则它应该使用基本类型,因为这既可以直接表明不可能为 null
,也可以避免不必要的装箱和拆箱转换。
示例¶
在下面的示例中,变量 done
控制循环退出。它只在循环进入之前设置为 false
,并在循环迭代期间的某个时刻设置为 true
。
Boolean done = false;
while (!done) {
// ...
done = true;
// ...
}
每次对 done
的赋值都涉及到一个装箱转换,而检查则涉及到一个拆箱转换。由于 done
永远不会是 null
,因此可以通过使用基本类型来完全避免这些转换,并使代码更清晰。因此,代码应该按以下方式重写
boolean done = false;
while (!done) {
// ...
done = true;
// ...
}