2017-07-19 5 views
-2

Java8 ermöglicht eine statische Methode. Es wäre wirklich hilfreich, wenn irgendjemand erklären würde, in welchem ​​Szenario wir möglicherweise eine Schnittstelle zu statischen Methoden benötigen.Statische Methoden in Java8

Vielen Dank im Voraus.

+3

Haben Sie versucht, Google für etwas wie "Java 8 Interface statische Methode"? –

Antwort

1

Ressource gefunden werden here und here:

  1. Java-Schnittstelle statische Methode ist Teil der Schnittstelle, können wir es nicht für die Umsetzung Klassenobjekte verwenden.
  2. Java-Schnittstelle statische Methoden sind gut für die Bereitstellung von Utility-Methoden, zB NULL-Prüfung, Sammlung Sortierung usw.
  3. Java-Schnittstelle statische Methode hilft uns Sicherheit durch nicht sie Implementierungsklassen ermöglicht außer Kraft setzen bei der Bereitstellung.
  4. Wir können keine statische Methode der Schnittstelle für Object-Klassenmethoden definieren, wir erhalten einen Compilerfehler wie "Diese statische Methode kann die Instanzmethode nicht aus dem Objekt ausblenden". Dies liegt daran, dass es in Java nicht zulässig ist, da
  5. Object die Basisklasse für alle Klassen ist und wir nicht eine statische Methode auf Klassenebene und eine andere Instanzmethode mit derselben Signatur haben können.
  6. Wir können statische Java-Interface-Methoden verwenden, um Hilfsklassen wie Collections zu entfernen und alle ihre statischen Methoden auf die entsprechende Schnittstelle zu verschieben, die leicht zu finden und zu verwenden wäre.
3

Nun, haben Sie die jdk Quellen gesucht? Wie wäre es mindestens zwei Beispiele:

Function.identity() 

, die eine Implementierung wie hat:

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

Oder Predicate.isEqual, die wie folgt aussieht:

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

Allgemeinen Ich behandle sie als statische Factory-Methoden

die eine Instanz dieser Schnittstelle zurückgeben.

Ich habe ein großartiges Beispiel dafür, dass wir in unserem Code-Basis verwenden (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

Von dem, was ich habe understood-

1.These Methoden nicht von Klassen überschrieben, die erben werden können es.

2. Sie sind nur für die Funktionen dieser Schnittstelle zugänglich (dürfen nicht überschrieben werden).

So können sie verwendet werden, wann immer Sie möchten, dass die Funktion (die nicht statisch noch überschrieben ist) Ihrer Schnittstelle diese Funktion verwenden (die statisch ist).

So können Sie Ihre eigene Geschäftslogik darin verwenden, Ihre eigenen Sortiermethoden, einige Einschränkungen oder Begrenzungen.

So kann es verwendet werden, als wenn jemand Ihre Funktion anruft und Sie Ihre eigenen Sachen darin mit Hilfe anderer Funktionen machen.Es ist so, dass der andere Programmierer Ihre Schnittstelle implementiert, um eine Funktion zu benutzen, die eine gewisse Unterstützung für sein eigenes Programm bietet (zB Kalender, der Notizen speichern, Ihre Meetings planen kann, usw.).

Aber denken Sie daran, dass Sie die Funktion, die diese statische Funktion aufruft, nicht überschrieben haben sollten.