CodeQL 文档

低效的原始构造函数

ID: java/inefficient-boxed-constructor
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - efficiency
   - maintainability
Query suites:
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

基本类型(例如 intfloatboolean)都有对应的引用类型,称为装箱类型(例如 IntegerFloatBoolean)。当需要实际对象时,可以使用这些装箱类型。虽然它们都提供采用适当类型的基本值的构造函数,但通常认为直接调用这些构造函数是不好的做法。

每个装箱类型都提供一个静态 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));
	}
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私