JDK1.7新特性

1. 二進制文本

在jdk1.7之前,所支持的進制包括十進制、八進制和十六進制。八進制在數字字面量前面添加0來表示,十六進制在數字字面量前面添加0x來表示。如果要處理二進制值,就必須進行基礎的轉換,或者調用parseX方法。如:想讓int x變量用位模式(計算機中所有二進制的0、1代碼所組成的數字串)表示十進制值102,可以這樣寫:

int x = Integer.parseInt("1100110", 2);
在jdk1.7中,byte、short、int、long的位模式表示法就是在位模式的前面添加前綴0b或0B,如下顯示二進制文本:

// An 8-bit 'byte' value:
byte aByte = (byte)0b00100001;

// A 16-bit 'short' value:
short aShort = (short)0b1010000101000101;

// Some 32-bit 'int' values:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // The B can be upper or lower case.

// A 64-bit 'long' value. Note the "L" suffix:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;

2. 在數字字面量中使用下劃線

在jdk1.7中,不管是整數還是浮點數,都允許在數字之間插入多個下劃線。這些下劃線不會對數字字面量的數值產生影響,其目的是提高代碼可讀性。如下所示:

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =      3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
注意數字字面量中的下劃線只能出現在數字中間,也就是說前後都是數字。其他寫法都是非法的。

3. 在switch中使用字符串

在jdk1.7之前,switch中的條件表達式的類型只能是Char、Byte、Short、Integer和Enum類型。在jdk1.7中,switch條件表達式增加了String類型,如下:

public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
     String typeOfDay;
     switch (dayOfWeekArg) {
         case "Monday":
             typeOfDay = "Start of work week";
             break;
         case "Tuesday":
         case "Wednesday":
         case "Thursday":
             typeOfDay = "Midweek";
             break;
         case "Friday":
             typeOfDay = "End of work week";
             break;
         case "Saturday":
         case "Sunday":
             typeOfDay = "Weekend";
             break;
         default:
             throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
     }
     return typeOfDay;

4. 泛型實例的類型推斷

在jdk1.7之前,創建一個泛型類型的對象總是需要顯式指定實際的類型,泛型類型聲明在構造方法的類型聲明和創建的對象的引用類型聲明中同時出現,如:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();
在jdk1.7中對這個對象創建形式進行了簡化,在調用構造方法時不需要顯式聲明類型,直接使用“<>”來代替,具體的類型通過對象引用的類型來進行推斷,如:

Map<String, List<String>> myMap = new HashMap<>();

5. 優化可變參數的方法調用

jdk5.0中在方法聲明中引入了可變參數,在調用時這些參數以數組的形式來調用。在jdk1.7之前如果可變參數是不可具體化類型時,如List<String>,編譯器會產生警告信息。這其中的原因是可變參數的實際值是通過數組來傳遞的,而數組中存儲的是不可具體化的泛型類對象,自身存在類型安全問題。因此編譯器會給出警告信息(禁止這個警告可用@SuppressWarnings("unchecked")註解)。
爲了解決這個問題,jdk1.7中引入了@SafeVarargs註解,如下:
@SafeVarargs
public static <T> void addToList3 (List<T> listArg, T... elements) {
    for (T x : elements) {
      listArg.add(x);
    }
}
@SafeVarargs註解只能用在可變參數的方法或構造函數上,且方法必須是static或final,否則出現編譯錯誤。使用@SafeVarargs的前提是開發人員必須確保這個方法的實現對泛型類型參數的處理不會引發類型安全問題。

6. try-with-resources語句

在讀取磁盤文件、訪問數據庫等資源時都有可能拋出各種異常,而資源管理不管操作是否成功,所申請的資源都要被正確釋放。之前可以通過try-catch-finally的finally語句塊來釋放資源操作。
爲了簡化這種操作,jdk1.7對try語句進行了增強,它支持對資源進行管理,保證資源正確釋放,如下代碼所示:

public String readFile(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();
	}
}
以上代碼不需要finally來釋放資源,資源的申請是在try子句中進行的,而資源的釋放則是自動完成的。能夠被try管理的資源需要滿足一個條件,就是資源類必須實現java.lang.AutoCloseable接口,一般的文件、數據庫連接等均已實現該接口,close方法將被自動調用。
try-with-resources還可以對多個資源進行管理,如:

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);
		}
	}
}

7. 異常處理改善

在jdk1.7之前的異常出路語句中,一個catch子句只能捕獲一個異常類,如:
catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}
對於這種情況,jdk1.7改進了catch子句的語法,允許在其中指定多個異常類,每個異常類之間用“|”來分割。如下:
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
在進行異常處理的時候,如果當前代碼無法處理異常,應該把異常重新拋出,交由上層代碼來處理。jdk1.7對重新拋出異常時的異常類型做了更加精確的判斷,保證異常的確可以正常拋出,可以拋出大於聲明的異常類型,如下:
static class FirstException extends Exception { }
static class SecondException extends Exception { }

public void rethrowException(String exceptionName)
throws FirstException, SecondException {
    try {
      // ...
    }
    catch (Exception e) {
      throw e;
    }
}



發佈了7 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章