现在的位置: 首页 > 综合 > 正文

第一个方法,close everything

2011年04月27日 ⁄ 综合 ⁄ 共 1574字 ⁄ 字号 评论关闭

     作为一个有始有终的人,开始做一件事情后,无论事情的结局如何,一定要做收尾工作。程序里面也是如此,在申请资源的访问权限后,用完之后,就必须释放。

     多数情况下,释放工作是与程序的运行结果及状态无关的。一般我们会写在finally块中。可是问题又出来了,因为多数情况下close这个函数会抛出异常。而这个异常往往是不影响我们程序的运转的。

try {
// do something
} catch(Exception ex) {
// do exception
} finally {
try{
in.close();
}
catch(Exception ex) {
}
try{
out.close();
}
catch(Exception ex) {
}
}

这样的写法会影响我们程序的可读性和美观。当然,会加大我们程序员的工作量。所以一个万能的close,是很有必要的。

 

 

     让我们来分析下,我们一般性需要调用close函数的有哪些objcet:InputStream,OutputStream,Writer,Reader。(这些东西在jdk1.5后都实现了Closeable接口)。Connection、Statement、ResultSet。所以要实现这样的函数,只要考虑这些情况就OK了。

 

     我们有两种思路来实现这个函数,第一种,定义N个不同的参数不同的close函数,利用编译器的能力实现类型区分。还有一个办法,比较简单只实现一个close(Object o)的函数。我推荐这个,为什么呢?请看实现

代码

public static void close(Object o) {
if (o != null) {
try {
if (o instanceof Connection) {
((Connection) o).close();
}
else if (o instanceof Statement) {
((Statement) o).close();
}
else if (o instanceof ResultSet) {
((ResultSet) o).close();
}
else if (o instanceof OutputStream) {
((OutputStream) o).close();
}
else if (o instanceof InputStream) {
((InputStream) o).close();
}
else if (o instanceof Writer) {
((Writer) o).close();
}
else if (o instanceof Reader) {
((Reader) o).close();
}
else {
Class c
= o.getClass();
c.getMethod(
"close",new Class[0]).invoke(o,new Object[0]);
}
}
catch (Exception ex) {

}
}
}

 

     唯一巧妙的地方就是我们给这个函数加了一个万能的close功能,只要对象有可访问的无参数close方法,我们就调用并执行它。

 

     这下我们就可以在前面的例子中我们就可以使我们的代码初步美化了

try {
// do something
} catch(Exception ex) {
// do exception
} finally {
close(in);
close(out);
}

 

 

     作为一个追求完美的人(其实是足够懒),是不会满足这种程度的简化的。我们继续

public static void close(Object... objs) {
for ( int i = 0, size = objs == null ? 0 : objs.length; i < size; i++ ) {
close(objs[i]);
}
}

   整个世界清静了

 

 

try {
// do something
} catch(Exception ex) {
// do exception
} finally {
close(in,out);
}

 

抱歉!评论已关闭.