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