Was ist ein Rückruf in Java [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Jack Welsch

Mögliches Duplikat:

Was ist eine Callback-Funktion?

Ich habe die Wikipedia-Definition eines Rückrufs gelesen, aber ich habe es immer noch nicht verstanden. Kann mir jemand erklären, was ein Rückruf ist, insbesondere die folgende Zeile

In der Computerprogrammierung ist ein Callback ein Verweis auf ausführbaren Code oder ein Stück ausführbaren Code, der als Argument an anderen Code übergeben wird. Dadurch kann eine Softwareschicht einer niedrigeren Ebene eine Subroutine (oder Funktion) aufrufen, die in einer Schicht einer höheren Ebene definiert ist.

  • @Pangea Tatsächlich ist die in diesem Beitrag gefundene Definition die von Wikipedia, und das OP bittet hier um eine Klarstellung der Definition von Wikipedia. Vielleicht ist es also kein Duplikat.

    – Mike Nakis

    5. Januar 2012 um 1:24 Uhr

  • Callback ist im Allgemeinen eine Funktion, die als Argument bereitgestellt wird. Callbacks in Java sind Inversion of Control (Witz).

    – Andrey Chaschev

    31. Oktober 2013 um 10:00 Uhr


  • Sprachen neigen dazu, unterschiedliche Mechanismen für Rückrufe zu haben. Dies kann kein Duplikat einer sprachagnostischen Frage sein.

    – Brent Bradburn

    21. August 2018 um 14:07 Uhr

Benutzer-Avatar
DejanLekic

Rückrufe lassen sich am einfachsten in Bezug auf die Telefonanlage beschreiben. Ein Funktionsanruf ist vergleichbar damit, jemanden am Telefon anzurufen, ihr eine Frage zu stellen, eine Antwort zu erhalten und aufzulegen; Das Hinzufügen eines Rückrufs ändert die Analogie, sodass Sie ihr, nachdem Sie ihr eine Frage gestellt haben, auch Ihren Namen und Ihre Telefonnummer mitteilen, damit sie Sie mit der Antwort zurückrufen kann.

Paul Jakubik, Callback-Implementierungen in C++.

Vielleicht würde ein Beispiel helfen.

Ihre App möchte eine Datei von einem Remotecomputer herunterladen und dann auf eine lokale Festplatte schreiben. Der entfernte Computer ist die andere Seite eines DFÜ-Modems und einer Satellitenverbindung. Die Latenz- und Übertragungszeit wird enorm sein und Sie haben andere Dinge zu tun. Sie haben also eine Funktion/Methode, die einen Puffer auf die Festplatte schreibt. Sie übergeben einen Zeiger auf diese Methode an Ihre Netzwerk-API, zusammen mit dem Remote-URI und anderen Dingen. Dieser Netzwerkaufruf wird „sofort“ zurückgegeben, und Sie können Ihre anderen Aufgaben erledigen. 30 Sekunden später trifft der erste Puffer vom entfernten Computer auf der Vermittlungsschicht ein. Die Netzwerkschicht ruft dann die Funktion auf, die Sie während des Setups übergeben haben, und so wird der Puffer auf die Festplatte geschrieben – die Netzwerkschicht hat “zurückgerufen”. Beachten Sie, dass in diesem Beispiel der Rückruf auf einem Netzwerkschicht-Thread statt auf dem ursprünglichen Thread erfolgen würde, aber das spielt keine Rolle – der Puffer wird trotzdem auf die Festplatte geschrieben.

  • Aber es funktioniert genauso, als ob die Netzwerkfunktion die WriteToDisk-Funktion normal aufruft, was ist der Vorteil eines Rückrufs?

    – Raffael

    28. Juni 2014 um 5:18 Uhr

  • @ Rafael Diaz . Der Punkt hier ist, dass die Netzwerkfunktion von Natur aus nicht wissen/sich darum kümmern kann (oder sollte), was Sie mit diesen Daten tun möchten, wenn Sie sie erhalten. Anstatt also anzugeben, was mit den Daten zur Kompilierzeit geschehen soll, geben Sie zur Laufzeit an, was mit den Daten geschehen soll, sobald sie verfügbar sind. Wenn Sie ohne Rückrufe möchten, dass der “Anrufer” bestimmt, was mit den Daten geschehen soll, besteht Ihre einzige Möglichkeit darin, auf die Daten zu warten und es dann selbst in der Anruferfunktion zu tun.

    – Dimitri

    7. August 2015 um 22:41 Uhr

Ein Rückruf ist ein Code, den Sie an eine bestimmte Methode übergeben, damit sie zu einem späteren Zeitpunkt aufgerufen werden kann.

In Java ist ein offensichtliches Beispiel java.util.Comparator. Normalerweise verwenden Sie a nicht Comparator direkt; Stattdessen übergeben Sie es an einen Code, der die aufruft Comparator zu einem späteren Zeitpunkt:

Beispiel:

class CodedString implements Comparable<CodedString> {
    private int code;
    private String text;

    ...

    @Override
    public boolean equals() {
        // member-wise equality
    }

    @Override
    public int hashCode() {
        // member-wise equality 
    }

    @Override
    public boolean compareTo(CodedString cs) {
        // Compare using "code" first, then
        // "text" if both codes are equal.
    }
}

...

public void sortCodedStringsByText(List<CodedString> codedStrings) {
    Comparator<CodedString> comparatorByText = new Comparator<CodedString>() {
        @Override
        public int compare(CodedString cs1, CodedString cs2) {
            // Compare cs1 and cs2 using just the "text" field
        }
    }

    // Here we pass the comparatorByText callback to Collections.sort(...)
    // Collections.sort(...) will then call this callback whenever it
    // needs to compare two items from the list being sorted.
    // As a result, we will get the list sorted by just the "text" field.
    // If we do not pass a callback, Collections.sort will use the default
    // comparison for the class (first by "code", then by "text").
    Collections.sort(codedStrings, comparatorByText);
}

  • schöne Antwort, gutes Beispiel.

    – Raúl

    30. Januar 2017 um 11:20 Uhr

Ein Rückruf wird häufig in der asynchronen Programmierung verwendet, sodass Sie eine Methode erstellen könnten, die die Antwort von einem Webdienst verarbeitet. Wenn Sie den Webdienst aufrufen, können Sie ihm die Methode übergeben, damit der Webdienst, wenn er antwortet, die Methode aufruft, die Sie ihm gesagt haben … er “ruft zurück”.

In Java kann dies üblicherweise durch die Implementierung einer Schnittstelle und die Übergabe eines Objekts (oder einer anonymen inneren Klasse) erfolgen, das sie implementiert. Sie finden dies häufig bei Transaktionen und Threading – wie z. B. der Futures-API.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html

  • Es sei denn, Sie zählen Lambdas in Java 8 … dann haben wir Funktionsreferenzen!

    – Dan Hardiker

    5. Januar 2012 um 1:31 Uhr

  • Funktionsreferenzen in Java 8 sehen nur aus der Sicht des Aufrufers wie Funktionsreferenzen aus. Von der empfangenden (und zurückrufenden) Partei sehen sie aus (sie sind tatsächlich) normale Schnittstellen.

    – Mike Nakis

    9. August 2015 um 20:58 Uhr

In Java werden Callback-Methoden hauptsächlich verwendet, um die “Beobachtermuster“, das eng mit „Asynchronous Programming“ verwandt ist.

Obwohl Callbacks auch verwendet werden, um Übergabemethoden als Parameter zu simulieren, wie es in funktionalen Programmiersprachen der Fall ist.

1026440cookie-checkWas ist ein Rückruf in Java [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy