2017-07-19 92 views
-2

Java8允許接口具有靜態方法。如果有人解釋在哪種情況下我們可能需要使用靜態方法進行接口,那將會非常有用。Java8中的靜態方法

在此先感謝。

+3

你有沒有試過Google爲「java 8 interface static method」之類的東西? –

回答

1

資源可以發現herehere

  1. Java接口的靜態方法是界面的一部分,我們不能用它來實現類的對象。
  2. Java接口的靜態方法有利於提供實用方法,例如空檢查,收集整理等
  3. Java接口的靜態方法幫助我們通過提供安全不允許實現類覆蓋它們
  4. 我們無法爲Object類方法定義接口靜態方法,因爲「這個靜態方法不能從Object中隱藏實例方法」,我們會得到編譯器錯誤。這是因爲它不允許在java中使用,因爲
  5. 對象是所有類的基類,我們不能有一個類級別的靜態方法和另一個具有相同簽名的實例方法。
  6. 我們可以使用java接口靜態方法來移除集合等實用工具類,並將其所有靜態方法移至相應的接口,這將很容易找到和使用。
3

那麼你是否搜索jdk源代碼?如何至少兩個例子:

Function.identity() 

有一個實現爲:

static <T> Function<T, T> identity() { 
    return t -> t; 
} 

或者Predicate.isEqual,看起來像:

static <T> Predicate<T> isEqual(Object targetRef) { 
    return (null == targetRef) 
      ? Objects::isNull 
      : object -> targetRef.equals(object); 
} 

一般我把他們當作靜態工廠方法返回該接口的一個實例。

我有這個,我們在我們的代碼庫使用(but it comes from Holger initially)一個很好的例子:

public interface UncheckedCloseable extends Runnable, AutoCloseable { 
    @Override 
    default void run() { 
     try { 
      close(); 
     } catch (Exception ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

    static UncheckedCloseable wrap(AutoCloseable c) { 
     return c::close; 
    } 

    default UncheckedCloseable nest(AutoCloseable c) { 
     return() -> { 
      try (UncheckedCloseable c1 = this) { 
       c.close(); 
      } 
     }; 
    } 
} 
0

從我有誤 -

1.這些方法不能被繼承類覆蓋它。

2.他們只能訪問該接口的功能(不能被覆蓋)。

所以,只要你希望你的接口的函數(它不是靜態的,也不是重寫的)使用那個函數(靜態的),就可以使用它們。

因此,您可以使用自己的業務邏輯,自己的排序方法,一些限制或邊界。

所以它可以被用作好像有人打電話給你的功能,你在其他功能的幫助下做你自己的東西。這就像其他程序員實現你的界面來使用一些爲其自己的程序提供支持的函數(例如,可以保存筆記的日曆,計劃你的會議等)。

但請記住,您不應該重寫調用這些靜態函數的函數。