Java7新特性
特性1:二進制字面值(Binary Literals) 在java7里,整形(byte,short,int,long)類型的值可以用二進制類型來表示了,在使用二進制的值時,需要在前面加上ob或oB,看代碼 |
Java代碼 如果用十六進制來表示的,它們之間的關系就無法一眼看出來了。 特性2:數字變量對下劃線_的支持 你可以在數值類型的變量里添加下滑線,除了以下的幾個地方不能添加:
這個大家期待很久了,switch終于支持String了 public static void first() { //項目狀態 String status = "approval"; //我們之前經常根據項目狀態不同來進行不同的操作 //目前已經換成enum類型 switch (status) { case "shouli": System.out.println("狀態是受理"); break; case "approval": System.out.println("狀態是審批"); break; case "finish": System.out.println("狀態是結束"); break; default: System.out.println("狀態未知"); } } 每個case是使用String的equals方法來進行比較的,對大小寫敏感。 和一連串的if-else-then想比,使用switch來比較String,Java編譯器會生成更加有效的字節碼,寫一個例子測試一下。 Java代碼 public static void second() { String status = "approval"; if ("shouli".equals(status)) { System.out.println("狀態是受理"); } else if ("approval".equals(status)) { System.out.println("狀態是審批"); } else if ("finish".equals(status)) { System.out.println("狀態是結束"); } else { System.out.println("狀態未知"); } }使用javap之后,生成字節碼如下:(略) 網上說,用switch之后比用if-else生成的字節碼更有效一些,不過目前至少從長度上來說,switch還是長一些 特性4:try-with-resources 聲明 try-with-resources 是一個定義了一個或多個資源的try 聲明,這個資源是指程序處理完它之后需要關閉它的對象。try-with-resources 確保每一個資源在處理完成后都會被關閉。 來看例子: public static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } } 在java 7 以及以后的版本里,BufferedReader實現了java.lang.AutoCloseable接口。 由于BufferedReader定義在try-with-resources 聲明里,無論try語句正常還是異常的結束, 它都會自動的關掉。而在java7以前,你需要使用finally塊來關掉這個對象。 public static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { if (br != null) br.close(); } }然而,如果 readLine() 和 close() 這兩個方法都拋出異常,那么readFirstLineFromFileWithFinallyBlock 方法只會拋出后面部分也就是finally塊中的內容,try塊中的異常就被抑制了,對于我們的程序來說,這顯然不是一種好的方式。 而在java 7中,無論是try塊還是try-with-resource中拋出異常,都能捕捉到。 有 另外,一個try-with-resourcse聲明了可以包含多個對象的聲明,用分號隔開,和聲明一個對象相同,會在結束后自動調用close方法,調用順序和生命順序相反。 try ( java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName); java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset) ) { // do something } 此外,try-with-resources 可以跟catch和finally,catch和finally的是在try-with-resources里聲明的對象關閉之后才執行的。 特性5:捕獲多種異常并用改進后的類型檢查來重新拋出異常 在Java SE7里,一個catch可以捕獲多個異常,這樣可以減少重復代碼。每個異常之間用 | 隔開。 public static void first(){ try { BufferedReader reader = new BufferedReader(new FileReader("")); Connection con = null; Statement stmt = con.createStatement(); } catch (IOException | SQLException e) { //捕獲多個異常,e就是final類型的 e.printStackTrace(); } } 而在Java SE6以前,需要這樣寫 Java代碼 public static void second() { try { BufferedReader reader = new BufferedReader(new FileReader("")); Connection con = null; Statement stmt = con.createStatement(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }注意,如果一個catch處理了多個異常,那么這個catch的參數默認就是final的,你不能在catch塊里修改它的值。 另外,用一個catch處理多個異常,比用多個catch每個處理一個異常生成的字節碼要更小更高效。 2、用更包容性的類型檢查來重新拋出異常 在方法的聲明上,使用throws語句時,你可以指定更加詳細的異常類型。 static class FirstException extends Exception { } static class SecondException extends Exception { } public void rethrowException(String exceptionName) throws Exception { try { if (exceptionName.equals("First")) { throw new FirstException(); } else { throw new SecondException(); } } catch (Exception e) { throw e; } } 這個例子,try塊中只能拋出兩種異常,但是因為catch里的類型是 Exception,在java SE7以前的版本中,在方法聲明中throws 只能寫Exception,但是在java SE7及以后的版本中,可以在throws后面寫 FirstException和SecondException——編譯器能判斷出throw e語句拋出的異常一定來自try塊,并且try塊只能拋出FirstException和SecondException。 public static void reThrowException(String exceptionName) throws FirstException, SecondException{ try { if ("first".equals(exceptionName)) throw new FirstException(); else throw new SecondException(); } catch (Exception e) { throw e; } } 所以盡管catch里的異常類型是Exception,編譯器仍然能夠知道它是FirstException和 SecondException的實例。怎么樣,編譯器變得更智能了吧。 但是,如果在catch里對異常重新賦值了,在方法的throws后無法再象上面那樣寫成FirstException和SecondException了,而需要寫成 Exception。 具體來說,在Java SE 7及以后版本中,當你在catch語句里聲明了一個或多個異常類型,并且在catch塊里重新拋出了這些異常,編譯器根據下面幾個條件來去核實異常的類型: 特性6:創建泛型對象時類型推斷 只要編譯器可以從上下文中推斷出類型參數,你就可以用一對空著的尖括號<>來代替泛型參數。這對括號私下被稱為菱形(diamond)。 在Java SE 7之前,你聲明泛型對象時要這樣 List<String> list = new ArrayList<String>(); |