2016-04-12 13 views
0

Lasst uns sagen, dass wir innere Klasse haben (Rest des Codes ist nicht wirklich wichtig, ich denke, DataStructureIterator nur die Schnittstelle von java.util.Iterator<Integer> erweitert ist):Java-Schnittstelle vs Klasse als Rückgabetyp

private class EvenIterator implements DataStructureIterator.

Jetzt wollen wir eine Methode erstellen, die eine neue Instanz von EvenIterator zurückgibt. Als ich bemerkte, können wir es auf verschiedene Weise tun:

  1. public EvenIterator getEvenIterator(){return new EvenIterator();}
  2. public DataStructureIterator getEvenIterator() {return new EvenIterator();}

Ich fand heraus, dass beide Versionen des Codes gut kompiliert, aber ich kann es einfach nicht, was der Unterschied ist (wenn es welche gibt) zwischen ihnen und welche Version sollte verwendet werden.

+0

Dies ist ein Kernprinzip der OOP. Sie können Bücher, Blogposts, Videos und mehr finden, die diese Frage ausführlicher beantworten, als Sie jemals wünschen könnten. Versuchen Sie "Polymorphismus" zu suchen. – Sam

+0

@Sam Ich lerne aus dem Orakel-Tutorial und der Polymorphismus-Teil war noch nicht, so wie ich Beispiele analysierte, konnte ich es nicht bekommen. Ich werde darüber lesen, danke! – Kubekk

Antwort

1

Kommt drauf an. Wenn Ihr Methodenvertrag besagt, dass Sie eine Art Iterator (d. H. Keine bestimmte Implementierung) zurückgeben, geben Sie die Schnittstelle zurück. Mit anderen Worten, Ihr Vertrag sagt "Übernehmen Sie kein anderes Verhalten/keine andere Funktionalität als die Möglichkeit, über Ganzzahlen zu iterieren". Der Vorteil hierbei ist, dass Sie die zugrunde liegende Implementierung später für etwas anderes auslagern können. Anrufer interessieren sich nicht und sollten es auch nicht tun.

Auf der anderen Seite, wenn Vertrags Ihre Methode ist, dass Sie einen Iterator zurückgeben, dass speziell die Fähigkeit, nur über geraden Zahlen iterieren bietet, Rückkehr EvenIterator. Dies bedeutet notwendigerweise, dass Sie die Implementierung (zu etwas, das nicht gerade über ganze Zahlen iteriert) nicht austauschen können, und das bedeutet, dass Sie den Vertrag brechen/ändern. Sie könnten weiter abstrahieren und EvenIterator selbst eine Schnittstelle machen und verschiedene Implementierungen für den Iterator bereitstellen (vielleicht iteriert man über eine interne verknüpfte Liste, eine andere über ein internes Array oder vielleicht bietet man die Möglichkeit, über bestimmte Arten von geraden ganzen Zahlen zu iterieren; , Potenzen von 2 gegen Potenzen oder 4).

+0

In beiden Fällen ist die return-Anweisung 'new EvenIterator()'. Definieren des Rückgabetyps als Schnittstelle <- bedeutet es, dass wir tatsächlich keine Klasse zurückgeben, sondern nur von Funktionen (Methoden der Klasse) trennen, die einfach iterieren können? Bei der Rückgabe von 'new EvenIterator()' habe ich zwar den gleichen Rückgabetyp, aber wie das Beispiel zeigt, muss es eine Schnittstelle sein, oder? – Kubekk

+0

Der Interface-Rückgabetyp funktioniert, weil 'EvenIterator' die Schnittstelle implementiert. Ich bin mir nicht sicher, was Sie mit "Aus Funktionen (Klassenmethoden)" meinen; Die tatsächliche Instanz selbst wird zurückgegeben. Wenn der Rückgabetyp aus der Perspektive des aufrufenden Codes die Schnittstelle ist, kann er nicht mehr vom Rückgabewert als von der angegebenen Schnittstelle ausgehen, da dies der Rückgabetyp der Methode ist. Beispielsweise können Sie keine öffentliche Methode aufrufen, die nur auf EvenIterator definiert ist, da sie nicht Teil der Schnittstelle ist. –

+0

Danke, das war genau das, was ich meinte. Ich habe Code geschrieben und das funktioniert auch so. – Kubekk

Verwandte Themen