Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Java好像自从1.6就已经可以使用void method(String... s)的方法声明参数列表,这个声明方式挺好玩的,我分享一下我的使用经验。

这个声明有一个特点,就是可变长的参数声明必须在传参列表的最后面。也就是说,void method(Object o, String... s)可以,但是void method(String... s, Object o)是不符合语法的。String... s是半个语法糖,可变长参数列表只能放在传参的最后面。那么这样子用起来某些场合就有那么点小限制了,但是这并不太妨碍,只要这样就行了。

void method(String[] s, Object o){
    //Codes...
}

void method(Object o, String... s){
    method(s,o);
}

上面举例的代码可能太抽象,我用我的实际应用场景来继续说明一下。为了方便说明,我先给一些刚入门的同学介绍一下SpringData。这里的介绍摘自官网首页,并附上我的翻译。

Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.

It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services.

Spring Data 的任务是提供一个符合标准和习惯的、保留了一些底层数据访问特性的、基于 Spring 的访问数据的框架,让使用关系型数据库、非关系型数据库、MapReduce 框架(MapReduce 是 Google 提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算)以及云端数据服务等数据访问技术变得更加方便。

那么接下来我有这么一串代码在DAO接口里:

@Query("select a from Article a where a.status in ?1")
Page<Article> findAll(String[] status, PageRequest pageRequest);

PS:这是一个符合Spring Data 规范的 PagingAndSortingRepository 接口子接口方法声明规范的一个方法。在这个接口里面声明的方法,能够通过 ?1 的方式传入到上面的 @Query 注解里的 JQL(JIRA Query Language)语句里面。

这个方法用途是从存放 Article 对象的表中查询出符合 status 数组里条件的数据并返回成分页查询对象。根据规范,我的分页请求必须在参数列表里,但是为了方便以后编程,我想使用可变长参数列表,于是就撞上了语法限制了。但是想一下,DAO 上一层就是 Services 层,Services 层代理了 DAO 的访问。于是结合之前讲的原理,我在 Services 层里的一个代理方法里这样写

public Page<Article> getAllArticle(PageRequest pageRequest, String... status) {
    return articleDAO.findAll(status, pageRequest);
}

这样就能愉快地使用可变长参数列表啦。

getAllArticle(new PageRequest(),"shown","hidden","banned");

之前考虑到如果只传一个参数的话会怎么。答案其实显而易见,就是传进来一个只有一个元素的数组。因为它是把可变长参数包装成了数组,原因是 String... a; 其实是 Java 里面的一种声明数组的方式。

评论