低效的原始构造函数¶
ID: java/inefficient-boxed-constructor
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- efficiency
- maintainability
Query suites:
- java-security-and-quality.qls
基本类型(例如 int
、float
、boolean
)都有对应的引用类型,称为装箱类型(例如 Integer
、Float
、Boolean
)。当需要实际对象时,可以使用这些装箱类型。虽然它们都提供采用适当类型的基本值的构造函数,但通常认为直接调用这些构造函数是不好的做法。
每个装箱类型都提供一个静态 valueOf
方法,该方法采用适当的基本类型的参数并返回一个表示它的对象。调用 valueOf
的优点在于,它允许对实例进行一些缓存。通过重用这些缓存的实例,而不是始终构造新的堆对象,可以节省大量垃圾回收器工作。
建议¶
在几乎所有情况下,都可以使用 Integer.valueOf(42)
等调用,而不是 new Integer(42)
。
请注意,有时你可以依赖 Java 的自动装箱功能,它会隐式调用 valueOf
。有关详细信息,请参阅示例。
示例¶
以下示例展示了创建新整数的三种方法。在自动装箱示例中,零被自动装箱为 Integer
,因为构造函数 Account
采用此类型的参数。
public class Account {
private Integer balance;
public Account(Integer startingBalance) {
this.balance = startingBalance;
}
}
public class BankManager {
public void openAccount(Customer c) {
...
// AVOID: Inefficient primitive constructor
accounts.add(new Account(new Integer(0)));
// GOOD: Use 'valueOf'
accounts.add(new Account(Integer.valueOf(0)));
// GOOD: Rely on autoboxing
accounts.add(new Account(0));
}
}
参考¶
J. Bloch,Effective Java(第二版),第 1 和第 5 项。Addison-Wesley,2008 年。
Java API 规范:Boolean.valueOf()、Byte.valueOf()、Short.valueOf()、Character.valueOf()、Integer.valueOf()、Long.valueOf()、Float.valueOf()、Double.valueOf()。