背景
臨時接到一個查詢數據庫數據并生成txt文件,并打包zip上傳到ftp的功能。
代碼自然不算特別復雜,但是發現我們項目使用了1.7的jdk后,瞬間來了興趣,以前一直想用沒敢用的要拿上來試試看了。
簡略代碼如下
普通寫法自然是類似這樣
private static void generateData(DateTime time, String dataPath) {
Connection connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
try {
///查詢語句
/// 寫入文件
} catch (Exception e) {
}finally{
IOUtils.closeQuiet(connection);
}
}
jdk提供的語法糖,類似C#的with關鍵字,寫出代碼如下:
private static void generateData(DateTime time, String dataPath) {
try (Connection connection = (Connection) DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL,
Constant.MYSQL_USERNAME, Constant.MYSQL_PWD)) {
///查詢語句
/// 寫入文件
} catch (Exception e) {
}
}
可以看到,這里沒有寫finally,那么生效的語句是什么樣子呢,我們用jad反編譯下生成的class
private static void generateData(DateTime time, String dataPath)
{
Connection connection;
Throwable throwable;
connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
throwable = null;
try
{
///查詢語句
/// 寫入文件
}
catch(Throwable throwable1)
{
throwable = throwable1;
throw throwable1;
}
if(connection != null)
if(throwable != null)
try
{
connection.close();
}
catch(Throwable x2)
{
throwable.addSuppressed(x2);
}
else
connection.close();
break MISSING_BLOCK_LABEL_486;
Exception exception;
exception;
if(connection != null)
if(throwable != null)
try
{
connection.close();
}
catch(Throwable x2)
{
throwable.addSuppressed(x2);
}
else
connection.close();
throw exception;
Exception e;
e;
}
jdk編譯的時候已經很聰明地自動加上了finally還有關閉的語句了。
這樣可以是我們更加專注于業務,不在寫冗余的finally等代碼了。
用法與注意點
采用此語法糖方式很簡單,JDK≥1.7。
而且需要寫在try()里面的變量支持JDK中提供的Autoclose接口
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package java.lang;
public interface AutoCloseable {
void close() throws Exception;
}
括號內語句支持多個變量,用分號分隔,類似就是多條語句
try(Connect conn = ....;
InputStream is = ......;)
這樣,jdk在編譯的時候就會自動生成相應的finally和close語句了。