1. 程式人生 > >java9新特性:在接口中用pirvate方法讓default(java8接口特性)更簡練

java9新特性:在接口中用pirvate方法讓default(java8接口特性)更簡練

譯文 OS 實現 -- 直接 幫助 創建 str 新特性

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

方法,你會發現它們幾乎相同。唯一的區別就是在filter方法中使用了不同的謂語而已。

這種重復的代碼又土又沒有必要。理應讓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接口特性)更簡練