[[oktatas:programozás:java|< Java]]
====== Java Callback ======
* **Szerző:** Sallai András
* Copyright (c) 2022, Sallai András
* Szerkesztve: 2022, 2023
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== A callback függvényekről =====
A callback egy olyan függvény, ami paraméterként egy másik függvényt vár.
Egy műveletet, egy függvényt egy másik függvénynek szeretnénk átadni végrehajtásra.
Általában eseménykezelésre, aszinkron műveletekre használjuk.
===== Runnable osztály =====
Az alábbi példában, a hívás helyén névtelen függvényt adunk át a valami() függvény számára.
public class App {
public static void valami(Runnable mehet) {
mehet.run();
}
public static void main(String[] args) throws Exception {
valami(()-> {
System.out.println("működik");
});
}
}
===== Interfész =====
Készíthetünk saját interfészt is a megvalósításhoz:
interface Valami {
public void csinal();
}
public class App {
public static void mas(Valami mehet) {
mehet.csinal();
}
public static void main(String[] args) throws Exception {
mas(() -> {
System.out.println("bbb");
});
}
}
===== Callback paraméterrel =====
interface Valami {
public void csinal(String msg);
}
public class App {
public static void mas(Valami mehet) {
mehet.csinal("akármi");
}
public static void main(String[] args) throws Exception {
mas((msg) -> {
System.out.println(msg);
});
}
}
===== ActionListener megvalósítás =====
Egy Messanger nevű komponenst készítünk, amihez eseményt lehet rendelni.
Az esemény itt szimulált. Nem egy egér kattintás, vagy egy szerver válasza,
csak egy Thread.sleep() hívás.
interface ActionListener {
void onMessage(String message);
}
class Messanger {
void addActionListener(ActionListener listener) {
// Az aszinkron folyamat szimulációja
new Thread(() -> {
try {
Thread.sleep(3000); // Szimulált várakozás 3 másodpercig
} catch (InterruptedException e) {
e.printStackTrace();
}
// Majd hívjuk meg a callback függvényt a háttérszálon
listener.onMessage("Üzenet érkezett");
}).start();
}
}
public class Main {
public static void main(String[] args) {
Messanger messanger = new Messanger();
// messanger.addActionListener(new ActionListener() {
// public void onMessage(String msg) {
// System.out.println(msg);
// }
// });
messanger.addActionListener(msg -> {
System.out.println(msg);
});
System.out.println("Program 10 másodpercig fut...");
// Várakozzunk, hogy lássuk az aszinkron működést
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}