为什么拳击比var args更受欢迎



我从JLS中了解到,加宽比装箱更可取,装箱比var args更可取。

我知道,拓宽是传统的方法论,设计师倾向于将其作为优先事项。我不明白的是为什么拳击比var args更受欢迎。这是我关心的两个问题。

  1. 为什么拳击比var args更受欢迎
  2. 如何解释幕后拳击和var参数

有人能举例说明吗?

据我所知,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) 

在这两种情况下,都会生成一个对象。那么前者比后者更快?

谢谢,

实际上,var将框和取消框转换为类型的数组,所以我认为它们是互补的,而不是排他性的选择。

现在,出于性能原因,在许多情况下,您可能会选择一个而不是另一个,因为创建不必要的对象是不需要支付的费用。这就是为什么很多时候var arg方法都带有其零arg、一arg、两arg和三arg的表亲。各种等效调用绑定在var arg版本之前,为var arg调用的低arg计数版本(希望是常见的)提供了一条更快的路径。

人们可能使用var args而不是boxing的地方是,他们倾向于将arg变为泛型类型列表,比如(Object…parameters)而不是(Int x,Float precision,Boolean visible),但在我看来,这只是一种糟糕的做法。

---编辑答案以回应问题编辑---

所以这两种情况是

// 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) 

唯一有意义的可替换调用场景是单参数调用场景。第一个装箱方法不支持零和两个arg,因此如果我们谈论这两个装箱方法是等效的,它们就不能被视为有效的参数列表。

因此,在功能上,后一个在像一样调用时是不正确的

boxing(5, 4);

就性能而言,它在像一样调用时也很受欢迎

boxing(null);

由于第一个根本不需要任何装箱,而第二个则需要将null转换为零元素的数组,因此在试图取消装箱函数中的数组时不会出现null指针异常。

因此,如果您有一个可选的单个基元参数,请使用boxing而不是var-args,因为varargs在概念上是错误的(允许额外的参数),并且在没有值的情况下,性能会受到影响(创建零长度数组)。

注意:在许多情况下,为了使null参数调用正常工作,您需要强制转换。

boxing((Integer)null);

我只能想象,如果你尝试,这会产生什么样的拳击骗局

boxing((int)null);

最新更新