java9新特性:在接口中用pirvate方法讓default(java8接口特性)更簡練
阿新 • • 發佈:2018-05-09
譯文 OS 實現 -- 直接 幫助 創建 str 新特性 修飾的方法,這樣我們就可以在接口中構造更加簡練的代碼。
方法,你會發現它們幾乎相同。唯一的區別就是在filter方法中使用了不同的謂語而已。
Java8 帶來了許多改變,其中之一就是default修飾的接口方法。
這些方法改變了我們已知的接口,現在我們能夠在接口中定義默認實現方法。默認實現方法的不同之處在於,在接口中用default修飾抽象方法後,該方法可以擁有方法體,實現他的方法可以不重寫default修飾的方法而且可以直接調用。
如果你大量使用default方法在你的應用接口中,你將很快意識到他沒有真正精簡代碼。
因為你不能在接口中提煉default裏重復的代碼到一個新的普通方法,這與以精簡代碼為目的的default關鍵字相沖突。
但在java9中這個問題被引入的 private interface methods 解決了。這些新定義的規則可以讓你在接口中創建private
利用Java9的 private interface methods 重構 default 方法
代碼實例:
接口--Archive
public interface Archive { List<Article> getArticles(); default List<Article> filterByTitle(String title) { return getArticles().stream() .filter(article -> article.getTitle().equals(title)) .collect(Collectors.toList()); }default List<Article> filterByTag(String tag) { return getArticles().stream() .filter(article -> article.getTags().contains(tag)) .collect(Collectors.toList()); } }
正如你所看到的,Archive包含一個抽象方法- getArticles ,和兩個default方法- filterByTitle 和 filterByTag 。
現在,如果你仔細觀察兩個default
這種重復的代碼又土又沒有必要。理應讓default代碼更加簡練,幸運的是Java9的 private interface method 可以幫上忙。
下面是用 private interface methods 重寫的Archive:
public interface NewArchive { List<Article> getArticles(); default List<Article> filterByTitle(String title) { return filterBy(article -> article.getTitle().equals(title)); } default List<Article> filterByTag(String tag) { return filterBy(article -> article.getTags().contains(tag)); } private List<Article> filterBy(Predicate<Article> toFilterBy) { return getArticles().stream() .filter(toFilterBy) .collect(Collectors.toList()); } }
這就是想要的結果,通過提取除了謂語以外的代碼,我們移除了重復的內容,也讓代碼更具有可讀性。
*英文鏈接:deadCodeRising
*原創譯文,如有幫助,樂意之至
java9新特性:在接口中用pirvate方法讓default(java8接口特性)更簡練