[size=medium]泛型现在开发中用的比较多, 但是可变参数用的比较少, 我突然发现很多功能只有在应用才能发现他的好处, 以前也知道jdk1.5已经开始支持可变参数了, 也知道是怎么回事, 但是从来没有用过, 今天在写单元测试的时候, 有时候需要构造一个List, 于是每次要new一个ArrayList, 然后一次次的add, 做一次无所谓, 做的多了, 人就烦了, 能不能有更好的方式来减轻我的烦恼? 于是重构出鸟下面的这个方法:
后来一看, 突然发现我还用这个鸟的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]
/**
* 将数组换换成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]