借贷模式
http://blog.csdn.net/zl3450341/article/details/24658755
我们不需要关注Scanner怎么创建,用完以后怎么关闭。我们只要专注于业务逻辑即可。
package newwork.loan;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
* Created by chin on 7/24/15.
*/
public class ResourceHolder {
public static void main(String[] args) throws FileNotFoundException {
// 需求打开一个文件输出文件中的每一行
/**
* 通常的做法如下
*/
// 创建file对象
File ignoreFile = new File("./.gitignore");
// 创建Scanner对象
Scanner sc = new Scanner(ignoreFile);
while (sc.hasNext()) {
System.out.println(sc.next());
}
sc.close(); // 注意:我们要自己处理关闭的操作
/**
* 借贷模式的做法
*/
// 传入一个file对象,一个接口,这个接口有个doTask方法,这个方法需要的参数是Scanner
// Scanner是桥梁
withScanner(new File("./.gitignore"), new TaskHandler() {
@Override
public void doTask(Scanner scanner) {
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
}
});
}
public static void withScanner(File file, TaskHandler handler) throws FileNotFoundException {
// 根据传入的file对象,创建scanner
Scanner scanner = new Scanner(file);
try {
// 把scanner对象传到handler对象的doTask方法中
handler.doTask(scanner);
} finally {
// 关闭scanner
scanner.close();
}
// 注意调用withScanner方法的地方就不用处理关闭的操作了,更加便捷
// 外部调用的地方也不用try-catch了
}
public interface TaskHandler {
void doTask(Scanner scanner); //doTask方法接受scanner参数,如何理解
}
}
试着比较两种调用方法,那个更加简洁?
早期用hibernate与spring集成的时候,大家写BaseDao,为了保证session在spring管控范围内,是不是写过这样的代码:
public List findByPage(final String hql,final int offset,final int pageSize){
List list = getHibernateTemplate().executeFind(
new HibernateCallback(){
public Object doInHibernate(Session session){
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}