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