Halo, hari ini saya ingin berbagi sesuatu dengan Anda, misalnya ini banyak digunakan dalam JavaScript. Saya akan berbicara tentang panggilan balik. Tahukah Anda kapan dan bagaimana menggunakannya? Apakah Anda benar-benar memahami penggunaannya di lingkungan Java? Ketika saya bertanya pada diri sendiri pertanyaan-pertanyaan ini, itulah mengapa saya mulai meneliti hal ini. Ide di balik ini adalah Inversion of Control (PS: Penjelasan Wikipedia adalah Inversion of Control, disingkat IoC), yaitu prinsip desain dalam pemrograman berorientasi objek yang dapat digunakan untuk mengurangi keterkaitan antar kode komputer.) Contoh ini menjelaskan cara kerja kerangka kerja, juga berdasarkan pada "prinsip Hollywood - Jangan panggil saya, kami akan menelepon Anda" yang terkenal.
Gunakan pola panggilan balik sederhana di Java untuk memahaminya.
antarmuka CallBack { void methodToCallBack();}class CallBackImpl mengimplementasikan CallBack { public void methodToCallBack() { System.out.println("Saya telah dipanggil kembali" }}class Caller { public void register(CallBack callback) { callback .methodToCallBack(); } public static void main(String[] args) { Penelepon = Penelepon baru(); CallBackImpl(); pemanggil.register(callBack);
Anda mungkin ingin bertanya kepada saya, kapan menggunakan ini atau apa perbedaan antara mekanisme panggilan langsung dan panggilan balik?
Jawabannya adalah: Contoh ini hanya menunjukkan kepada Anda cara membuat fungsi panggilan balik di lingkungan Java. Tentu saja tidak ada gunanya menggunakannya seperti itu. Sekarang mari kita periksa lebih detail.
Ide di dalamnya adalah inversi kendali. Mari kita gunakan pengatur waktu sebagai contoh kehidupan nyata. Misalkan Anda mengetahui bahwa ada pengatur waktu khusus yang mendukung panggilan balik setiap jam. Tepatnya, setiap jam, pengatur waktu akan memanggil metode panggilan yang Anda daftarkan.
Contoh spesifik:
Kami ingin memperbarui situs web setiap jam. Berikut contoh model UML:
Antarmuka panggilan balik:
Pertama-tama mari kita definisikan antarmuka panggilan balik:
import java.util.ArrayList;import java.util.List;// Misalnya: Anggaplah antarmuka ini ditawarkan dari OS Anda untuk diimplementasikaninterface TimeUpdaterCallBack { void updateTime(long time);}// ini implementasi Anda./ / misalnya: Anda ingin memperbarui waktu situs web Anda setiap jamkelas WebSiteTimeUpdaterCallBack mengimplementasi TimeUpdaterCallBack { @Override public void updateTime(long time) { // mencetak waktu yang diperbarui di mana saja dalam contoh situs web Anda System.out.println(time }}
Dalam contoh kita, pengatur waktu sistem mendukung metode panggilan balik:
// Ini adalah SystemTimer yang diterapkan oleh Sistem Operasi (OS) Anda// Anda tidak tahu bagaimana pengatur waktu ini diterapkan. Contoh ini hanya// menunjukkan kepada Anda bagaimana tampilannya sendiri jika Anda ingin.class SystemTimer { List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>(); timerCallBack) { callbacks.add(timerCallBack } // ... SystemTimer ini mungkin memiliki lebih banyak logika di sini yang kami tidak tahu ... // Pada titik tertentu implementasi SystemTimer ini (Anda tidak tahu) / / metode ini akan dipanggil dan setiap timerCallBack // akan dipanggil. Setiap timerCallBack yang terdaftar mungkin memiliki // implementasi metode yang berbeda updateTime() dan // digunakan dengan cara yang berbeda oleh klien yang berbeda oneHourHasBeenExprired() { untuk (TimeUpdaterCallBack timerCallBack : panggilan balik) { timerCallBack.updateTime(System.currentTimeMillis());
Terakhir, inilah pembaru waktu situs web dalam contoh sederhana tiruan kami:
// Ini adalah klien kami. Ini akan digunakan dalam contoh Situs Web kami. Ini akan memperbarui// waktu situs web setiap jam. class WebSiteTimeUpdater { public static void main(String[] args) { SystemTimer SystemTimer = new SystemTimer(); webSiteCallBackUpdater = WebSiteTimeUpdaterCallBack(); SystemTimer.registerCallBackForUpdatesSetiap Jam(webSiteCallBackUpdater); }}
Teks asli: http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understanding-callbacks-with-java.html