Tip 10 Java: Implementasikan rutinitas callback di Java

Pengembang yang fasih dalam model pemrograman berbasis peristiwa dari MS-Windows dan Sistem X Window terbiasa meneruskan pointer fungsi yang dipanggil (yaitu, "dipanggil kembali") ketika sesuatu terjadi. Model berorientasi objek Java saat ini tidak mendukung penunjuk metode, dan oleh karena itu tampaknya menghalangi penggunaan mekanisme yang nyaman ini. Tapi semuanya tidak hilang!

Dukungan antarmuka Java menyediakan mekanisme yang dengannya kita bisa mendapatkan callback yang setara. Triknya adalah dengan mendefinisikan antarmuka sederhana yang mendeklarasikan metode yang ingin kita panggil.

Misalnya, kita ingin diberi tahu ketika suatu peristiwa terjadi. Kita dapat mendefinisikan sebuah antarmuka:

public interface InterestingEvent {// Ini hanyalah metode biasa sehingga dapat mengembalikan sesuatu atau // mengambil argumen jika Anda mau. public void excitingEvent (); }

Ini memberi kita pegangan pada objek kelas apa pun yang mengimplementasikan antarmuka. Jadi, kita tidak perlu menyibukkan diri dengan informasi jenis asing lainnya. Ini jauh lebih bagus daripada meretas fungsi trampolin C yang menggunakan bidang data widget untuk menahan penunjuk objek saat menggunakan kode C ++ dengan Motif.

Kelas yang akan memberi sinyal acara perlu mengharapkan objek yang mengimplementasikan antarmuka InterestingEvent dan kemudian memanggil metode excitingEvent () yang sesuai.

public class EventNotifier {private InterestingEvent ie; private boolean sesuatu terjadi; public EventNotifier (acara InterestingEvent) {// Simpan objek acara untuk digunakan nanti. yaitu = peristiwa; // Belum ada untuk dilaporkan. somethingHappened = false; } // ... public void doWork () {// Periksa predikat, yang disetel di tempat lain. if (somethingHappened) {// Memberi sinyal genap dengan menjalankan metode antarmuka. yaitu.interestingEvent (); } // ...} // ...}

Dalam contoh itu, saya menggunakan predikat sesuatu yang Terjadi untuk melacak apakah acara tersebut harus dipicu atau tidak. Dalam banyak contoh, fakta bahwa metode itu dipanggil sudah cukup untuk menjamin menandakan excitingEvent () .

Kode yang ingin menerima pemberitahuan peristiwa harus mengimplementasikan antarmuka InterestingEvent dan hanya meneruskan referensi ke dirinya sendiri ke pemberi tahu peristiwa.

public class CallMe mengimplementasikan InterestingEvent {private EventNotifier en; public CallMe () {// Membuat event notifier dan meneruskannya sendiri ke sana. en = new EventNotifier (this); } // Tentukan penangan sebenarnya untuk acara tersebut. public void excitingEvent () {// Wow! Sesuatu yang sangat menarik pasti terjadi! // Lakukan sesuatu... } //... }

Itu saja yang ada untuk itu. Saya harap menggunakan idiom Java yang sederhana ini akan membuat transisi Anda ke Java sedikit lebih tenang.

Hidup dengan kafein, gula, dan kurang tidur, John D. Mitchell telah menjadi konsultan selama hampir sembilan tahun terakhir, dan telah mengembangkan perangkat lunak PDA dalam bahasa assembly OO di Geoworks. Dia mendanai kecanduan Java-nya dengan menulis kompiler, Tcl / Tk, C ++, dan sistem Java. Dia ikut menulis buku baru Java, Making Sense of Java dan saat ini sedang mengembangkan kompiler Java.

Artikel ini, "Java Tip 10: Implementasikan rutinitas callback di Java" pada awalnya diterbitkan oleh JavaWorld.