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

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

黄舟
黄舟Original
2017-08-22 10:10:451618Durchsuche

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);
}

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()"); });
}

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();
}

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());
  }
}

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()");
      }
    });

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);
      }
    });

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; });

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

do_func(() -> { System.out.println(msg); });

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!

Stellungnahme:
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