Heim Java javaLernprogramm Werden die Standardmethoden von Java 8 den Benutzercode beschädigen?

Werden die Standardmethoden von Java 8 den Benutzercode beschädigen?

Apr 19, 2023 pm 06:16 PM
java

Werden die Standardmethoden von Java 8 den Benutzercode beschädigen?

Auf den ersten Blick scheint es, dass die Standardmethode viele neue Funktionen zum Befehlssatz der Java Virtual Machine bringt. Letztendlich können Bibliotheksentwickler die API aktualisieren, ohne dass Kompatibilitätsprobleme mit dem Client-Code auftreten. Mit Standardmethoden passt sich jede Klasse, die eine Bibliotheksschnittstelle implementiert, automatisch an die von der Schnittstelle eingeführten Standardmethoden an. Sobald der Benutzer die von ihm implementierte Klasse aktualisiert, ist es einfach, die ursprüngliche Standardmethode durch eine aussagekräftigere Methode zu überschreiben. Noch besser: Benutzer können die Standardimplementierung der Schnittstelle aufrufen und beim Überschreiben der Methode Geschäftslogik hinzufügen.

So weit, so gut. Das Hinzufügen von Standardmethoden beim Erstellen einer Schnittstelle kann jedoch dazu führen, dass Java-Code nicht kompatibel ist. Dies lässt sich anhand des folgenden Beispiels leicht verstehen. Nehmen wir an, dass eine Bibliothek eine ihrer Schnittstellen als Eingabe benötigt:

interface SimpleInput {   void foo();   void bar(); }  abstract class SimpleInputAdapter implements SimpleInput {   @Override   public void bar() {     // some default behavior ...   } }
Nach dem Login kopieren

Vor Java 8 war es ähnlich der oben genannten Methode zum Kombinieren einer Schnittstelle und einer Adapterklasse ein sehr verbreitetes Entwurfsmuster in der Programmiersprache Java. Dieser Adapter wird normalerweise vom Bibliotheksanbieter bereitgestellt, um Benutzern der Bibliothek bestimmte Vorgänge zu ersparen. Wenn es jedoch in Form einer Schnittstelle bereitgestellt wird, ähnelt es der Ermöglichung einer Mehrfachvererbung.

Wir gehen weiterhin davon aus, dass ein Benutzer den folgenden Adapter verwendet:

class MyInput extends SimpleInputAdapter {   @Override   public void foo() {     // do something ...   }   @Override   public void bar() {     super.bar();     // do something additionally ...   } }
Nach dem Login kopieren

Mit dieser Implementierung können wir endlich mit der Bibliothek interagieren. Beachten Sie, wie wir die bar-Methode überschreiben und der Standardimplementierung zusätzliche Funktionalität hinzufügen.

Was passiert, wenn diese Bibliothek auf Java 8 portiert wird? Erstens wird die Bibliothek höchstwahrscheinlich die Adapterklasse verwerfen und die Standardmethode verwenden, um diese Funktionalität bereitzustellen. Schließlich sieht die Schnittstelle so aus:

interface SimpleInput {   void foo();   default void bar() {     // some default behavior   } }
Nach dem Login kopieren

Mit dieser neuen Schnittstelle kann der Benutzer seinen Code aktualisieren, um Standardmethoden anstelle der ursprünglichen Adapterklasse zu verwenden. Die letztendliche Konsequenz der Verwendung einer Schnittstelle anstelle einer Adapterklasse besteht darin, dass die Klasse andere Klassen anstelle eines bestimmten Adapters erweitern kann. Lassen Sie uns nun die MyInput-Klasse üben und transplantieren, um die Standardmethode zu verwenden. Da wir jetzt andere Klassen erweitern können, erweitern wir eine Basisklasse eines Drittanbieters. Wir müssen uns hier nicht um die Rolle dieser Basisklasse kümmern, wir können davon ausgehen, dass dies für unsere Funktion von Bedeutung ist.

class MyInput extends ThirdPartyBaseClass implements SimpleInput {   @Override   public void foo() {     // do something ...   }   @Override   public void bar() {     SimpleInput.super.bar();     // do something additionally ...   } }
Nach dem Login kopieren

Um ähnliche Funktionen wie die ursprüngliche Klasse zu erreichen, verwenden wir die neue Syntax von Java 8, um die Standardmethode der angegebenen Schnittstelle aufzurufen. Verschieben Sie gleichzeitig einen Teil der Logik unserer Methoden in die Basisklasse. An diesem Punkt klopfen Sie mir vielleicht auf die Schulter und sagen: Das ist ein sehr gutes Refactoring!

Wir haben diese Bibliothek recht erfolgreich genutzt. Allerdings müssen Betreuer eine weitere Schnittstelle hinzufügen, um mehr Funktionalität bereitzustellen. Diese Schnittstelle wird durch die ComplexInput-Schnittstelle ersetzt, die von der SimpleInput-Schnittstelle erbt und neue Methoden hinzufügt. Da das Hinzufügen von Standardmethoden im Allgemeinen sicher ist, haben die Betreuer die Standardmethode von SimpleInput überschrieben, um eine bessere Standardmethode bereitzustellen. Schließlich ist dies bei Adapterklassen üblich.

interface ComplexInput extends SimpleInput {   void qux();   @Override   default void bar() {     SimpleInput.super.bar();     // so complex, we need to do more ...   } }
Nach dem Login kopieren

Die neuen Funktionen brachten so gute Ergebnisse, dass sich auch die Leute, die ThirdPartyBaseClass verwalten, entschieden, auf diese Bibliothek zu vertrauen. Um diese Aufgabe zu erfüllen, implementiert es die ComplexInput-Schnittstelle in ThirdPartyLibrary.

Aber was bedeutet das für die MyInput-Klasse? Um die ComplexInput-Schnittstelle implizit zu implementieren, können Sie die ThirdPartyBaseClass-Klasse erben, aber der Aufruf der Standardmethode von SimpleInput wird plötzlich illegal. Infolgedessen kann der Code des Benutzers nicht kompiliert werden. Diese Art von Aufruf ist jetzt verboten, da Java es für illegal hält, die Methode der übergeordneten Klasse von einer nicht direkten Unterklasse aufzurufen. Sie können diese Standardmethode nur in ComplexInput aufrufen, dafür müssen Sie diese Schnittstelle jedoch explizit in MyInput implementieren. Für Benutzer der Bibliothek ist diese Änderung nicht zu erwarten!

Was noch seltsamer ist, ist, dass die Java-Laufzeitumgebung solche Einschränkungen nicht auferlegt. Der JVM-Validator ermöglicht es einer kompilierten Klasse, die SimpleInput::foo-Methode aufzurufen, auch wenn die Klasse die aktualisierte ThirdPartyBaseClass erbt und dadurch ComplexClass implizit implementiert. Diese Einschränkung besteht nur im Compiler.

Das obige ist der detaillierte Inhalt vonWerden die Standardmethoden von Java 8 den Benutzercode beschädigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

See all articles