2017-11-08 3 views
0

Ich habe einige Java-Code geerbt, das hat:Gibt es eine Begründung für diese verschachtelten Schnittstellen?

interface PairDeviceCallbacks extends BasePresenter { 
    interface View extends BaseView { 
    // declare some methods 
    } 
    void onDeviceClicked(...) 
} 

Class1 implements PairDeviceCallbacks und Class2 implements PairDeviceCallbacks.View. Ich verstehe nicht, warum es so strukturiert wurde, insbesondere warum die verschachtelte Schnittstelle. Warum nicht einfach zwei separate Top-Level-Schnittstellen? Gibt es einen Grund, diese Komplexität hinzuzufügen?

+1

Inwiefern ist die verschachtelte Schnittstelle komplexer als zwei separate Top-Level-Schnittstellen? – ruakh

+0

Könnte eine organisatorische Sache seitens des anderen Entwicklers sein. Denken Sie an SomeOtherInterface.View etc .. und um die Dinge aufrecht zu erhalten und den Anschein des Eigentums zu geben, würden sie wissen, immer die .View zu verwenden, auch wenn sie völlig unterschiedliche Methoden hatten. – ergonaut

+0

Es riecht wie ein C++ - Coder, der versucht, Namespace wie Bereiche in Java zu schreiben. – Doleron

Antwort

-1

Soweit ich weiß, hat das Verschachteln von Schnittstellen zwei Vorteile. Erstens, dass es uns erlaubt, Interfaces zu gruppieren, die miteinander verwandt sind und auch in einer Art und Weise Encapsulation verbessert. Das heißt, wir können die verschachtelte Schnittstelle nur aufrufen, indem wir die äußere Schnittstelle oder die Klasse im selben Paket verwenden.

+0

Das ist nicht was "Kapselung" bedeutet. – ruakh

+0

habe ich gesagt, dass das bedeutet Verkapselung? _ ** "und auch in gewisser Weise" ** verbessert die Kapselung_. Ich werde dich definieren lassen, was _ ** "in gewisser Weise" bedeutet. –

+2

Warum können wir die verschachtelte Schnittstelle nur über die äußere Schnittstelle aufrufen?Abgesehen davon, dass es paketinhaltlich ist, was hindert uns daran, es aus einer anderen Klasse in demselben Paket zu verwenden? Denken Sie daran, dass Schnittstellen keinen Status haben, also verschachtelte Schnittstellen implizit "statisch" sind, da sie sich nicht auf Instanzen des äußeren Typs beziehen können (können). – Andreas

0

Eine Schnittstelle muss von jemand anderem implementiert werden. Daher wird es oft als Anforderungen(Parameterklasse) verwendet. Es könnte gut sein, dass die äußere Schnittstelle Dinge auf etwas der inneren Schnittstelle tun muss (Definieren der erforderlichen Methoden).

Wenn das für die äußere Klasse/Schnittstelle sehr spezifisch ist, könnte man es als verschachtelte Schnittstelle behalten.

Die andere Nutzung einer Schnittstelle ist Dienste geliefert (return Ergebnisse) angeben. Es könnte gut sein, dass die äußere Klasse eine Methode liefert, die ein sehr spezifisches Objekt liefert. Solch eine spezifische Schnittstelle kann auch verschachtelt werden.

Wie spezifisch solch eine Schnittstelle ist, bestimmt, ob die Schnittstelle das Recht hat, unabhängig zu sein. Innere Schnittstellen dienen als Liste der benötigten Anforderungen oder Liste der angebotenen Dienste.


(Phantasie-) Beispiel

interface ChangeListener { 
    interface ChangeEvent { 
     Object getSource(); // Requirement: required functionality. 
     Object getOldValue(); 
     Object getNewValue(); 
    } 
    void onChange(ChangeEvent event); // Service: served/provided functionality. 
} 

// A library creator may add handling of colors: 
public class ColorChangeEvent implements ChangeEvent { 
    ColorChangeEvent(Object source, Color color) { ... } 
    Object getSource() { ... } 
    Color getColor() { .... } 
} 

// An API user may only need to subclass ChangeListener: 
add(new ChangeListener() { ... }); 

Hier würde man fast erwarten Generika, oder ein ColorChangeListener. Schnittstellen wurden für verschiedene Klassenhierarchien verwendet.


Für Rückrufe heute lambdas erscheinen häufiger auch spezifische Schnittstellen ersetzt nur eine einzige Methode zu geben: Consumer<List<Good>> und so.

Verschachtelte Klassen haben noch andere Gründe. Eine nicht statische innere Klasse hat Zugriff auf die äußere Instanz. Betrachten Sie eine äußere Container-Klasse wie Book und innere Klassen wie Chapter, die somit Zugriff auf das Inhaltsverzeichnis des Buches und dergleichen haben.

+0

Danke, aber ich habe Probleme zu verstehen, was du mit einer Schnittstelle meinst "wird oft als Voraussetzung (Parameterklasse)" verwendet. Könntest du ein wenig näher ausführen? Und zurück zu meiner ursprünglichen Frage, ich dachte, es sei merkwürdig, dass eine Klasse die äußere Schnittstelle implementierte, während eine andere Klasse die innere implementierte. Hatte das noch nie zuvor gesehen. –

+0

Ich habe ein bisschen künstliches Beispiel hinzugefügt, das verschiedene Akteure zeigt, die beide Schnittstellen implementieren. Allerdings gebe ich zu, dass ich beide Schnittstellen selten gesehen habe. –

Verwandte Themen