Use varargs judiciously

  • Item 42: Use varargs judiciously

    • varargs的原理是调用时首先创建一个数组,然后把传入的参数放入数组,数组长度为参数个数
    • 一个方法需要0或多个同类型数据这个需求很常见,然而也有另一个很常见的需求:需要一个或多个同类型数据,此时单纯用varargs不太优雅,可以让方法先接受一个数据,在接受一个varargs
    • varargs最初是为了printf和反射设计的
    • 可以通过把传入参数从一个数组改为varargs,来改良该方法(变得更灵活),而且对已有代码“无影响”,Arrays.asList便是一个例子,但接受varargs最初是为了打印数组内容设计的,而不是为了把多个数据变成一个List
    • Don’t retrofit every method that has a final array parameter; use varargs only when a call really operates on a variable-length sequence of values.

    • 以下两种函数声明都可能会产生问题:

      ReturnType1 suspect1(Object... args) { }
       ReturnType2 suspect2(T... args) { }

          有上述任何一种签名的方法都可以接受任何参数列表,改造之前(asList(Object[] a))进行的任何编译时的类型检查(如不能传递基本类型的数组)都将会丢失,Arrays.asList发生的情形正是说明了这一点。

    • 如果传入一个基本类型的数组进去(例如int[]),那么这两个方法接受的都是一个int[][],即相当于接受了一个只有一个元素的数组,而这个数组的数据类型是int[]!而如果传入一个对象的数组,则相当于传入了数组长度个数的varargs。Arrays.asList方法就存在这个问题!

    • varargs也存在性能影响,因为每次调用都会创建、初始化一个数组。如果为了不失API灵活性,同时大部分调用的参数个数都是有限个,例如0~3个,那么可以声明5个重载版本,分别接受0~3个参数,另外加一个3个参数+varargs的版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值