Java8中的默認方法

默認方法

  Java8中加入默認方法主要是爲了支持庫設計師,讓他們能夠寫出容易改進的接口。這一方法很重要,因爲你會在接口中遇到越來越多的默認方法,但由於真正需要編寫默認方法的程序員相對較少,而且它們只是有助於程序改進,而不是用於編寫任何具體的程序。
  兩段Java8示例代碼:

List<Apple> heavyApples1 =
	inventory.stream().filter((Apple a) -> a.getWeight() > 50).collect(toList());
List<Apple> heavyApples2 = 
    inventory.parallelStream().filter((Apple a) -> a.getWeight() > 50).collect(toList())	

但這裏有個問題:在Java8之前,List並沒有stream或者parallelStream方法,它實現的Collection接口也沒有。可沒有這些方法,這些代碼就不能編譯。最簡單的方法就是在Collection接口中加入stream方法,並加入ArrayList類的實現。
  可要是這樣做,對用戶來說就是噩夢了。有很多的替代集合框架都用Collection API實現了接口。但給接口加入一個新方法,意味着所有的實體類都必須爲其提供一個實現。語言設計者沒法控制Collections所有現有的實現,所以如何改變已發佈的接口而不破壞已有的實現呢?
  Java8的解決辦法就是打破最後一環——接口如今可以包含實現類沒有提供實現的方法簽名了。缺失的方法主體隨接口提供了,而不是由實現類提供。
  這就給接口設計者提供了一個擴充接口的方式,而不會破壞現有的代碼。Java 8在接口聲明中使用新的default關鍵字來表示這一點。
  例如,在Java 8裏,現在可以直接對List用sort方法。它是用Java8 List接口中如下所示的默認方法實現的,它會調用Collections.sort靜態方法:

default void sort(Comparator<? super E> c){
	Collections.sort(this,c);
}

  這意味着List的任何實體類都不需要顯式實現sort,而在以前的Java版本中,除非提供了sort的實現,否則這些實體類在重新編譯時都會失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章