Heim > Java > javaLernprogramm > Hauptteil

Beispielerklärung für die Verwendung anonymer Klassen zur Implementierung von Rückruffunktionen in Java

黄舟
Freigeben: 2017-08-22 10:10:45
Original
1599 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich Beispiele für die Implementierung von Rückruffunktionen durch Java über anonyme Klassen vorgestellt. Die Rückruffunktion ist eine Spezifikation einer Funktionssignatur (mehrere Eingabeparameter, ein Ausgabeparameter). Obwohl es in Java keine Funktionsdeklaration gibt, kann Java Schnittstellen verwenden Vorgaben durchzusetzen. Sie können die detaillierte Erklärung unten für die spezifischen Betriebsschritte lesen und interessierte Freunde können sich darauf beziehen.

In der Sprache C können Funktionsnamen als Funktionszeiger auf formale Parameter übergeben werden, um Rückrufe zu implementieren.


void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}
Nach dem Login kopieren

In C++11 werden Rückrufe implementiert kann auch über Funktionsvorlagen und Lambda-Ausdrücke implementiert werden


template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}
Nach dem Login kopieren

Wenn die Codeimplementierung der Rückruffunktion komplexer ist und einen Wiederverwendungswert hat, können Lambda-Ausdrücke wie The Eine einmalige Lösung ist nicht geeignet. Vor C++11 wurde sie über Funktionsobjekte implementiert. Um es ganz klar auszudrücken: Ein Funktionsobjekt ist ein gewöhnliches Objekt einer Klasse, aber C++ kann den Klammeroperator überladen, sodass der Aufruf der Methode „operator()“ eines Objekts der Klasse genauso natürlich ist wie der Aufruf einer Funktion.

Bei der Analyse des Wesentlichen handelt es sich bei der Rückruffunktion um eine Spezifikation einer Funktionssignatur (mehrere Eingabeparameter, ein Ausgabeparameter). Obwohl es in Java keine Funktionsdeklaration gibt, kann Java Schnittstellen verwenden, um Spezifikationen durchzusetzen.


interface Funcable {
  void Func();
}
Nach dem Login kopieren

Auf diese Weise, solange die Klasse, die die Schnittstelle implementiert, eine Mitgliedsfunktion mit derselben Funktionssignatur wie void Func() hat (naja, das bin ich immer noch nicht an Methoden gewöhnt) ), Sie müssen also nur das Objekt der Klasse, die die Schnittstelle implementiert, an die Funktion übergeben und dann die Func()-Methode des Objekts in der Funktion


aufrufen

class F1 implements Funcable {

  @Override
  public void Func() {
    System.out.println("f1()");
  } 
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  } 
  public static void main(String[] args) {
    do_func(new F1());
  }
}
Nach dem Login kopieren

Um hier die Menge an Code zu sparen, werden die Klassen F2 und F3 nicht geschrieben. Und die Verwendung der anonymen Klassen von Java kann Code speichern, ähnlich wie Lambda-Ausdrücke


  do_func(new Funcable() {      
      @Override
      public void Func() {
        System.out.println("f2()");
      }
    });
Nach dem Login kopieren

Apropos Lambda-Ausdrücke: Auf diese Weise können Sie in Java auch externe Variablen erfassen Erfassen Sie externe Variablen explizit durch anonyme Konstruktoren


  String msg = "f3()";
    do_func(new Funcable() {
      String _msg; 
      {
        _msg = msg;
      } 
      @Override
      public void Func() {
        System.out.println(_msg);
      }
    });
Nach dem Login kopieren

Dieser Ansatz ist Lambda-Ausdrücken sehr ähnlich, da anonyme Klassen Der anonyme Konstruktor kann nur externe Variablen als Konstruktionsparameter verwenden entspricht der „Erfassung“ eines Lambda-Ausdrucks. Der entsprechende Lambda-Ausdruck in C++ ist


 std::string msg = "f3()";
  do_func([&msg]() { std::cout << msg << std::endl; });
Nach dem Login kopieren

Java8 hat auch Lambda-Ausdrücke und kann daher so geschrieben werden

do_func(() -> { System.out.println(msg); });
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonBeispielerklärung für die Verwendung anonymer Klassen zur Implementierung von Rückruffunktionen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage