1. 程式人生 > >java7語法新特性

java7語法新特性

      1. switch中增加對String型別的支援。

public void getType(String type){
		switch(type){
			case "1": 
				System.out.println("type1");
				break;
			case "2": 
				System.out.println("type2");
				break;
			case "3": 
				System.out.println("type3");
				break;
			default: 
				System.out.println("type error");
		}
	}

      編譯器的編譯的時候先做處理:

      1) case只有一種情況,直接轉成if;

      2) 如果只有一個case和default,則直接轉換為if...else;

      3) 有多個case,先將String轉換為hashCode,然後對應的進行處理,JavaCode在底層相容Java7以前版本。

      2. 數字字面量的改進
      ① 增加二進位制表示
           Java7前支援十進位制(123)、八進位制(0123)、十六進位制(0X12AB)
           Java7增加二進位制表示(0B11110001、0b11110001)
      ② 數字中可新增分隔符
           Java7中支援在數字量中間增加'_'作為分隔符,更直觀,如(12_123_456),下劃線只能在數字中間,編譯時編譯器自動刪除數字中的下劃線。

      3. 異常處理
      ① Throwable類增加addSuppressed方法和getSuppressed方法,支援原始異常中加入被抑制的異常。
           異常抑制:在try和finally中同時丟擲異常時,finally中丟擲的異常會在異常棧中向上傳遞,而try中產生的原始異常會消失。
         在Java7之前的版本,可以將原始異常儲存,在finally中產生異常時丟擲原始異常:

    public void read(String filename) throws BaseException {
        FileInputStream input = null;
        IOException readException = null;
        try {
            input = new FileInputStream(filename);
        } catch (IOException ex) {
            readException = ex;   //儲存原始異常
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException ex) {
                    if (readException == null) {
                        readException = ex;
                    }
                }
            }
            if (readException != null) {
                throw new BaseException(readException);
            }
        }
    }

      在Java7中的版本,可以使用addSuppressed方法記錄被抑制的異常:
    public void read(String filename) throws IOException {
        FileInputStream input = null;
        IOException readException = null;
        try {
            input = new FileInputStream(filename);
        } catch (IOException ex) {
            readException = ex;
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException ex) {
                    if (readException != null) {    //此處的區別
                        readException.addSuppressed(ex);
                    }
                    else {
                        readException = ex;
                    }
                }
            }
            if (readException != null) {
                throw readException;
            }
        }
    }

      ②catch子句可以同時捕獲多個異常
    public void testSequence() {
        try {
            Integer.parseInt("Hello");
        }
        catch (NumberFormatException | RuntimeException e) {  //使用'|'分割,多個型別,一個物件e
           
        }
    }

      ③ try-with-resources語句
           Java7之前需要在finally中關閉socket、檔案、資料庫連線等資源;
          Java7中在try語句中申請資源,實現資源的自動釋放(資源類必須實現java.lang.AutoCloseable介面,一般的檔案、資料庫連線等均已實現該介面,close方法將被自動呼叫)。
    public void read(String filename) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
            StringBuilder builder = new StringBuilder();
			String line = null;
			while((line=reader.readLine())!=null){
				builder.append(line);
				builder.append(String.format("%n"));
			}
			return builder.toString();
        } 
    }

       try子句中可以管理多個資源:
    public void copyFile(String fromPath, String toPath) throws IOException {
        try ( InputStream input = new FileInputStream(fromPath);
				OutputStream output = new FileOutputStream(toPath) ) {
            byte[] buffer = new byte[8192];
			int len = -1;
			while( (len=input.read(buffer))!=-1 ) {
				output.write(buffer, 0, len);
			}
        } 
    }

      4. 變長引數方法的優化
         Java7之前版本中的變長引數方法:
    public int sum(int... args) {
        int result = 0;
        for (int value : args) {
            result += value;
        }
        return result;
    }

       當引數為不可具體化的型別時,如List,編譯器將產生警告,需要使用@SuppressWarnings("unchecked")註解宣告;Java7中使用@SafeVarargs註解抑制編譯器警告。
    @SafeVarargs
    public static <T> T useVarargs(T... args) {
        return args.length > 0 ? args[0] : null;
    }

     
VarargsWarning.useVarargs(new ArrayList<String>());