`
leonzhx
  • 浏览: 793326 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Item 42: Use varargs judiciously

阅读更多

1.  Varargs methods accept zero or more arguments of a specified type. The varargs facility works by first creating an array whose size is the number of arguments passed at the call site, then putting the argument values into the array, and finally passing the array to the method.

 

2.  You can retrofit an existing method that takes an array as its final parameter to take a varargs parameter instead with no effect on existing clients. But just because you can doesn’t mean that you should! It was a big mistake to enable varargs for Arrays.asList. Before Java 1.5, Arrays.asList only takes Object[] as parameter and will reject int[] at compile time. However after varargs is enabled for it, it will take int[] as one element and make an array of int[] as the parameter. Instead of retrofitting Arrays.asList, it would have been better to add a new method to Collections specifically for the purpose of gathering its arguments into a list:

 

public static <T> List<T> gather(T... args) {
    return Arrays.asList(args);
}

 

 

3.  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.

 

4.  Every invocation of a varargs method causes an array allocation and initialization. If you have determined empirically that you can’t afford this cost but you need the flexibility of varargs, there is a pattern that lets you have your cake and eat it too. Suppose you’ve determined that 95 percent of the calls to a method have three or fewer parameters. Then declare five overloadings of the method:

 

public void foo() { }
public void foo(int a1) { }
public void foo(int a1, int a2) { }
public void foo(int a1, int a2, int a3) { }
public void foo(int a1, int a2, int a3, int... rest) { }

The EnumSet class uses this technique for its static factories to reduce the cost of creating enum sets to a bare minimum.

 

分享到:
评论

相关推荐

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 53: Use varargs judiciously Item 54: Return empty collections or arrays, not nulls Item 55: Return optionals judiciously Item 56: Write doc comments for all exposed API elements 9 General ...

    Java中Varargs机制的理解.docx

    ### Java中的Varargs机制详解 #### 一、Varargs机制简介 在Java 5之前,如果需要编写一个能够接收数量可变的参数的方法,通常的做法是通过数组来实现。例如,`main`方法就是通过一个字符串数组来接收命令行参数。...

    C语言头文件 VARARGS

    C语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言...VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VAR

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    本教程将深入探讨如何在重载方法中利用Varargs(可变参数)技术,这是一项非常实用的功能,能够使方法接受任意数量的相同类型参数。此资源包包含了相关的源代码实例和详细教程,帮助你更好地理解和应用这一概念。 ...

    Java Varargs 可变参数用法详解

    Java Varargs 可变参数是Java 1.5引入的一项特性,它允许我们在方法签名中定义一个可变数量的参数。这种技术使得方法能够接受任意数量的相同类型的参数,而无需为每个参数创建单独的参数位置。在Java中,可变参数...

    Java 实例 - Varargs 可变参数使用源代码-详细教程.zip

    Java中的可变参数(Varargs)是自Java 5引入的一项特性,它允许函数接受一个或多个同类型的参数。在编程中,有时我们可能需要创建一个方法,该方法可以接收不同数量的相同类型参数,例如打印日志、计算数组元素等。...

    mongodb-windows-x86_64-enterprise-6.0.2-signed

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系...

    MongoDB中的主从同步配置和mongod相关启动命令讲解

    mongo -port 8001 use admin db.shutdownServer() ``` 5. **修复MongoDB**: 如果发现数据损坏,可以使用`repair`命令进行修复: ``` mongod --dbpath /data/masterdb/ repair mongod --dbpath /data/slavedb...

    SwiftParamTest:Swift的参数化测试

    assert ( to : max) { args ( 1 , 2 , expect : 2 ) args ( 2 , 1 , expect : 2 ) args ( 4 , 4 , expect : 4 )}// You can also use tuple (with label).assert ( to : max) { args (( x : 1 , y : 2 ), expect : ...

    Node-NormalizeArguments:[ABANDONED]几乎像重载方法一样规范参数(不是真的)

    归一化参数 标准化参数几乎就像重载方法一样(不是真... var args = require('normalize-arguments'); // or standalone build in browser: var args = normalizeArguments; var fn = function(list, count, data, bas

    completion.dart:用于将Shell命令完成功能添加到您的应用程序的软件包

    import 'package:args/args.dart' ; void main ( List &lt; String&gt; args) { final argParser = ArgParser ().. addFlag ( 'option' , help : 'flag help' ); // ... add more options ... final argResults = ...

    launch_args

    launch_args 目录 介绍 Flutter软件包,能够将args传递给Android或iOS应用程序。该插件目前仅支持Android和iOS,因为大多数其他平台直接将args提供给main功能。 用法 import 'package:flutter/material.dart' ; ...

    applix:使用非常舒适的选项和参数预处理构建 ruby​​ 命令行应用程序

    handle(:one) do |*args, opts| if opts[:verbose] puts "arguments: #{args.inspect}" puts "options: #{opts.inspect}" end end handle(:two) do |*args, opts| if opts[:verbose] puts "arguments: #{...

    Go-Args是一个用于构建优雅的命令行界面的简约参数解析库

    Go-Args库是针对Go语言开发的一个轻量级命令行参数解析工具,旨在帮助开发者创建具有用户友好界面的命令行应用程序。在Go语言中,处理命令行参数是编写可交互式程序的重要一环,Go-Args库为此提供了一个简洁且灵活的...

    Python库 | pylint-args-0.0.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:pylint-args-0.0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    函数参数:可变参数

    void varArgs(Args... args) { // 使用展开元组的技术遍历所有参数 (std::cout &lt;&lt; ... &lt;&lt; args) &lt;&lt; std::endl; } int main() { varArgs(1, 2, 3, "Hello", "World"); return 0; } ``` 这个C++的例子使用了模板...

    grunt-parallel:通过并行运行命令和任务来加快构建速度!

    咕unt声平行 并行运行命令和任务以加快构建速度。 入门 使用以下项目在项目的旁边安装此grunt插件: npm install grunt-parallel --save-dev ... args : [ 'fast' ] } , { grunt : true , args : [ 'block' ] } , {

    Python星号*与**用法分析

    def multiple(arg, *args): print arg: , arg #打印不定长参数 for value in args: print other args:, value if __name__ == '__main__': multiple(1,'a',True) 输出: 2. 加了星号(**)的变量名会存放所有...

    atom-linter:棉绒供应商的帮助程序模块

    原子线 atom-linter是一个npm...export function execNode ( filePath : String , args : Array &lt; string&gt; = [ ] , options : Object ) : Promise export function parse ( data : String , regex : String , option

Global site tag (gtag.js) - Google Analytics