我从JLS知道扩大比拳击更受欢迎,拳击比var-args更受欢迎。
我理解,扩展是传统方法,设计师倾向于将其作为优先事项。我无法理解的是为什么拳击比var-args更受欢迎。以下是我的两个问题。
有人可以用一个例子来解释吗?
据我所知,Var-args基本上构建了一个Arraytype来保存所提供的参数。我知道数组是一个对象。我想表明我对这个例子的困惑
// 1 Object is made which is basically a wrapper
public void boxing(Integer i);
// 1 object made which is an Array
public void boxing(int.. x)
在这两种情况下,都会制作一个对象。那么前者的路径比后者更快?
谢谢,
答案 0 :(得分:2)
实际上,var-args框和un-box成为类型的数组,所以我认为它们是免费的,而非独家的选择。
现在,出于性能原因,您可能会在很多情况下选择一个,因为不必要地创建对象是您不需要支付的费用。这就是为什么var-arg方法有多次出现零arg,one-arg,two-arg和three-arg堂兄弟的原因。各种等效调用在var-arg版本之前绑定,为var-arg调用的(希望是常见的)低arg计数版本提供了更快的路径。
人们可能在使用var-args而不是拳击是他们倾向于变成泛型类型列表的地方,比如(Object ...参数)over(Int x,Float precision,Boolean visible),但是&# 39;在我看来,这只是不好的做法。
---编辑答案以回应问题编辑---
所以这两个场景是
// 1 Object is made which is basically a wrapper
public void boxing(Integer i);
// 1 object made which is an Array
public void boxing(int.. x)
唯一可以替换这些内容的调用方案是one-arg调用方案。第一个装箱方法不支持零和两个参数,因此如果我们讨论的是两个相同的拳击方法,它们就不能被视为有效的参数列表。
从功能上来说,后者在调用
时是不正确的boxing(5, 4);
而且表现明智,当它被称为
时也是一个打击boxing(null);
由于第一个根本不需要任何装箱,而第二个需要将空转换为零元素数组,因此在尝试取消时不会出现空指针异常在函数中框出数组。
所以,如果你有一个可选的单个原语参数,使用boxing而不是var-args,因为varargs在概念上是错误的(通过允许额外的参数),并且在没有值的情况下,性能命中(到创建一个零长度数组。)
注意:要使null参数调用在许多情况下起作用,您需要强制转换。
boxing((Integer)null);
我只能想象如果你尝试过这会产生什么样的拳击神龛
boxing((int)null);