考慮這樣一種場景,你要為系統編寫一個下載檔案並快取到本地的功能,你會用到InputSteam和OutputStream類,你可能會這麼寫:
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("");
os = new FileOutputStream("");
//下載檔案的程式碼
//儲存到本地的程式碼
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在finally程式碼塊中,為了關閉兩個IO流居然寫了14行程式碼,假如每次用到IO的時候都寫一大堆if……else,也挺煩的,有沒有什麼辦法可以用一行程式碼就搞定呢?檢視InputStream和OutputStream抽象類原始碼,發現他們都實現了共同的介面Closeable,事實上,java中所有Stream類都必須實現這個介面,那麼,這下就好辦了。
我們可以設計一個工具類,如下:
public class IOUtil {
public static void close(Closeable... closeableList) {
try {
for (Closeable closeable : closeableList) {
if (closeable != null){
closeable.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
那麼,在finally程式碼塊中就可以這樣寫:
finally{
/* 這些程式碼都可以省略
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
*/
//只需要下面這一行程式碼就可以了
IOUtil.close(is, os);
}
是不是方便了很多呢?這個工具類用到了可變引數,介面隔離的思想。這樣寫程式碼,不僅僅只是方便而已,程式碼的可讀性也好了很多,不是嗎?