[size=medium]泛型现在开发中用的比较多, 但是可变参数用的比较少, 我突然发现很多功能只有在应用才能发现他的好处, 以前也知道jdk1.5已经开始支持可变参数了, 也知道是怎么回事, 但是从来没有用过, 今天在写单元测试的时候, 有时候需要构造一个List, 于是每次要new一个ArrayList, 然后一次次的add, 做一次无所谓, 做的多了, 人就烦了, 能不能有更好的方式来减轻我的烦恼? 于是重构出鸟下面的这个方法:
/**
* 将数组换换成list
*
* @param ids
* @return
*/
protected <T> List<T> getList(T... ids) {
List<T> list = new ArrayList<T>();
for (T id : ids) {
list.add(id);
}
return list;
}
后来一看, 突然发现我还用这个鸟的getList啊, 直接用可变参数不就得了, 连这个方法也省了.
其实可变参数就像我们平时用的list, array没什么区别, 也就是如果参数是String[] argment, 那么可以直接写成String... argment, 将[] 替换成三点即可.传递参数则少了一个new, 在jdk内部会将可变参数转换成数组.
下面就是实用可变参数的一些注意事项:
1.一个方法中只能存在一个可变参数;
2.可变参数必须后面不允许再跟有参数, 即可变参数必须是最后一个参数;
3.可变参数最好表示的数据最好是表示同一意义的一个无序的序列(比如可变参数都表示id), 如果一个序列中不同位置的数据具有不同的含义的话, 则会给方法的使用者带来理解上的困难, 并极易造成出错.
通过google我又发现了一个可变参数的好处:
在引入可变参数以后, Java 的反射包也更加方便使用了。
对于c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0])) ,
现在我们可以这样写了:c.getMethod("test").invoke(c.newInstance()),
这样的代码比原来清楚了很多。[/size]
分享到:
相关推荐
String 是不可变的,意味着一旦创建了 String 对象,不能修改其内容。String 提供了多种方法来操作字符串,例如 concatenation、substring、indexOf、equals 等。 接口和抽象类 接口和抽象类是 Java 中的两种基本...
在.NET框架中,ArrayList是System.Collections命名空间下的一种动态数组,它是C#早期版本中用于存储可变大小对象集合的主要工具。ArrayList虽然简单易用,但在.NET Framework 2.0之后,微软推荐使用更安全、性能更好...
02委托的基本应用,03委托的基本应用练习与总结,04_02自己写泛型委托,04_03Action泛型委托,04泛型委托,05泛型委托Func,06多播委托,07匿名方法,08Lambda表达式简介之输入参数,09匿名方法、Lambda表达式应用巩固举例,...
- 可变参数(Varargs):使得方法能够接受可变数量的参数,方便编写灵活的方法。 - 增强型for循环(Enhanced for loop):简化了数组或集合类的遍历操作。 - 枚举类型(Enums):提供了一种定义枚举常量的方法,...
- **JAVA**:字符串(String)是不可变的类,提供了丰富的字符串操作方法。 #### 十七、错误处理与异常 - **C++**:使用try/catch块处理异常,也支持传统的错误代码返回机制。 - **JAVA**:异常处理机制较为成熟,...
- **泛型中的应用**:讨论如何在泛型上下文中利用协变和逆变来提高代码的灵活性。 - **案例分析**:通过具体的例子来展示协变和逆变的实际应用。 4. **Attribute特性** - **Attribute简介**:介绍Attribute的...
5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...
- **弃元**:探讨弃元(out和ref关键字)在方法参数中的应用。 - **泛型**:深入剖析泛型的概念及其在提高代码复用性和类型安全性方面的作用。 - **迭代器**:讨论迭代器模式及其在C#中的实现。 - **委托和事件**: ...
- **string**是不可变字符串类型,每次修改都会创建新的string实例,不适用于频繁修改字符串的场景。 - **StringBuilder**是可变字符串类型,用于频繁修改字符串,具有更高的性能。 - 示例: ```csharp // 使用...
6. **委托与事件**:委托是C#中的函数指针,用于传递方法作为参数或实现回调机制。事件则是一种特殊的委托,常用于实现组件间的通信,如UI事件处理。 7. **接口(Interface)**:接口定义了一组方法签名,类可以...
- String类的特点,为什么String是不可变的? - 如何比较两个字符串是否相等?讲解`equals()`和`==`的区别。 - 使用StringBuilder或StringBuffer进行字符串拼接的优点。 9. **泛型** - 泛型的引入解决了什么...
- 方法可以接受可变数量的参数。 - **自动装箱/拆箱:** - 自动将基本数据类型的值转换成对应的包装类对象,反之亦然。 **示例问题:** - 解释JDK 1.5中引入的新特性有哪些? - 如何使用JDK 1.5中的泛型? - ...
- 参数化多态性:通过泛型实现。 - 包含多态性:通过继承和方法重写实现。 - **优点**: - 提高代码的灵活性。 - 支持动态绑定,提高程序的可扩展性。 #### 二、基本类型与包装类 **1. String是否为基本类型**...
String是不可变对象,上述操作会创建新的String对象,原始String对象的内容没有改变。 32. 是否可以继承String类? 不可以,String类被声明为final类,不能被继承。 33. Strings=newString("xyz"); 创建了几个...
- **泛型类与泛型方法:** 定义泛型类和方法的基本语法。 - **泛型的优点:** 类型安全性和代码重用性。 #### 44. Java中的位运算符 **知识点概述:** - **按位与 (&) 和按位或 (|):** 对应位上的按位逻辑运算。 ...
另一个重要的特性是折叠表达式(fold expressions),它扩展了变参模板的功能,使得开发者能够更容易地编写对可变数量参数的操作。这对于编写通用的库函数特别有用,比如可以利用折叠表达式来实现变参模板函数的求和...
5.5.1 接受数量可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为实参 249...
在Java开发中,代码安全是一个重要的考虑因素,尤其是对于那些包含商业机密或知识产权的应用。Jocky是一款专门用于混淆Java代码的工具,其目的是增强代码的安全性,防止未经授权的反编译和分析。 **1.1 Jocky是什么...
- 循环结构是程序设计中不可或缺的一部分。这部分将介绍while、do-while和for三种循环语句的使用方法。 **2.4 示例:计算框架** - 通过一个具体的实例来展示如何使用循环来生成一个由字符组成的框架。 **2.5 计数...