Kata pengantar
Callback berarti panggilan balik. Orang -orang yang terbiasa dengan pemrograman Windows harus terbiasa dengan empat kata "fungsi panggilan balik", tetapi pemrogram Java mungkin tidak tahu banyak tentang hal itu. "Fungsi Callback" atau "Metode Callback" adalah konsep yang sangat penting dalam desain dan pengembangan perangkat lunak. Sangat penting untuk pemrogram (terlepas dari bahasa mana).
Baru -baru ini, saya belajar Java dan bersentuhan dengan mekanisme panggilan balik (callback). Ketika saya pertama kali bertemu, saya merasa cukup bingung, dan penjelasan yang relevan yang saya cari online baru saja disebutkan atau dikatakan dengan sederhana, seolah -olah saya telah menentukan panggilan balik. Tentu saja, setelah saya mengerti panggilan balik, saya pergi untuk membaca berbagai penjelasan online, dan tidak ada masalah. Namun, bagi saya yang merupakan pemula, saya tidak memiliki proses bertahap. Di sini, saya akan menjelaskan pemahaman pribadi saya tentang mekanisme panggilan balik dalam urutan dari dangkal ke dalam. Jika ada ketidaksesuaian, saya harap saya akan memberi Anda nasihat!
Sebelum memulai, bayangkan sebuah skenario: anak -anak TK baru saja belajar tambahan dalam 10.
Bab 1. Asal usul cerita
Guru TK menulis formula "1 + 1 =" di papan tulis, dan Xiao Ming akan mengisi kekosongan.
Karena saya telah belajar penambahan kurang dari 10, Xiao Ming dapat menghitung pertanyaan ini sepenuhnya sendirian. Kode untuk mensimulasikan proses adalah sebagai berikut:
public class Student{private String name = null;public Student(String name){// TODO Auto-generated constructor stubthis.name = name;}public void setName(String name){this.name = name;}private int calcADD(int a, int b){return a + b;}public void fillBlank(int a, int b){int result = calcADD(a, b); System.out.println (Nama + "Aritmatika Mental:" + A + " +" + B + "=" + Hasil);}} Ketika Xiao Ming mengisi kekosongan, ia secara langsung menghitung Clacadd dan menemukan bahwa hasilnya adalah 2 dan menulis hasilnya di ruang. Kode tes adalah sebagai berikut:
tes kelas publik {public static void main (string [] args) {int a =; int b =; siswa s = siswa baru ("xiao ming"); s.fillblank (a, b);}} Hasil operasi adalah sebagai berikut:
Aritmatika mental Xiao Ming: 1 + 1 = 2
Proses ini dilakukan sepenuhnya oleh objek contoh kelas siswa saja dan tidak melibatkan mekanisme panggilan balik.
Bab 2. Pencarian masalah untuk guru taman kanak -kanak
Selama istirahat, guru taman kanak -kanak tiba -tiba memiliki kemauan dan menulis "168 + 291 =" di papan tulis untuk membiarkan Xiao Ming menyelesaikannya, dan kemudian kembali ke kantor.
Gosok bunga! Mengapa semua guru tidak bisa bergaul dengan Xiao Ming? Jelas di luar aturan, oke? Pada saat ini, Xiao Ming jelas tidak bisa menyelesaikannya dengan aritmatika mental seperti yang di atas. Ketika dia bingung, Xiao Hong di kelas menyerahkan kalkulator yang hanya bisa menghitung penambahan (profiteer)! Lai Lai Lai Xiao Ming kebetulan tahu cara menggunakan kalkulator, jadi ia menghitung hasilnya melalui kalkulator dan menyelesaikan pengisian-dalam-mereka.
Kode untuk kalkulator adalah:
Kalkulator kelas publik {public int add (int a, int b) {return a + b;}} Ubah kelas siswa dan tambahkan metode untuk menggunakan kalkulator:
Siswa kelas publik {private string name = null; siswa publik (nama string) {// todo auto-generated constructor stubthis.name = name;} public void setName (string name) {this.name = name;}@returning ("tidak digunakan") private int calcadd (int a, int b) {return a + b; Calculator (). Tambah (a, b);} public void fillblank (int a, int b) {int result = usecalculator (a, b); system.out.println (name + "Gunakan kalkulator:" + a + " + b +" = " + hasil);}}} Kode tes adalah sebagai berikut:
tes kelas publik {public static void main (string [] args) {int a =; int b =; siswa s = siswa baru ("xiao ming"); s.fillblank (a, b);}} Hasil operasi adalah sebagai berikut:
Xiao Ming menggunakan kalkulator: 168 + 291 = 459
Mekanisme panggilan balik belum terlibat dalam proses ini, tetapi beberapa pekerjaan Xiao Ming telah ditransfer dan akan dibantu oleh kalkulator.
3. Guru TK kembali
Ketika saya menemukan bahwa Xiao Ming telah menyelesaikan penambahan 3 digit, guru mengira Xiao Ming sangat cerdas dan bakat lunak. Jadi dia menulis "26549 + 16487 =" di papan tulis, meminta Xiao Ming untuk melengkapi pengisian-dalam sebelum kelas, dan kemudian kembali ke kantor.
Xiao Ming memandang teman kecil yang bersenang -senang di luar kelas dan tidak bisa tidak merasa sedih. Jika Anda tidak pergi bermain, istirahat ini akan hancur! Lai Lai Lai Melihat kalkulator yang diberikan Xiaohong lagi, Xiao Ming membuat rencana: biarkan Xiaohong melakukannya untuknya.
Xiao Ming mengatakan kepada Xiaohong bahwa pertanyaannya adalah "26549 + 16487 =", kemudian menunjukkan lokasi spesifik untuk mengisi hasil, dan kemudian pergi untuk bersenang -senang.
Di sini, kami tidak mengimplementasikan Xiaohong saja, tetapi menganggap kalkulator ini yang hanya dapat menghitung penambahan dan Xiaohong secara keseluruhan, kalkulator super yang dapat menghitung hasil dan mengisi kekosongan. Parameter yang perlu dilewati oleh kalkulator super ini adalah dua tambahan dan posisi untuk mengisi kekosongan, dan konten ini perlu diinformasikan sebelumnya, yaitu, Xiao Ming ingin mengekspos bagian dari metodenya ke Xiao Hong. Cara termudah adalah dengan memberi tahu Xiao Hong rujukannya dan dua tambahan bersama -sama.
Oleh karena itu, metode tambah supercalculator harus berisi dua operan dan referensi ke Xiao Ming sendiri, kodenya adalah sebagai berikut:
Public Class SuperCalculator {public void add (int a, int b, student xiaoming) {int result = a + b; xiaoming.fillblank (a, b, hasil);}} Xiao Ming tidak lagi membutuhkan aritmatika atau kalkulator mental, jadi ia hanya perlu memiliki metode untuk meminta bantuan Xiaohong. Kodenya adalah sebagai berikut:
public class Student{private String name = null;public Student(String name){// TODO Auto-generated constructor stubthis.name = name;}public void setName(String name){this.name = name;}public void callHelp (int a, int b){new SuperCalculator().add(a, b, this);}public void fillBlank(int a, int b, int Hasil) {System.out.println (Nama + "Mencari Perhitungan Xiaohong:" + A + " +" + B + "=" + Hasil);}} Kode tes adalah sebagai berikut:
tes kelas publik {public static void main (string [] args) {int a =; int b =; siswa s = siswa baru ("xiao ming"); s.callhelp (a, b);}} Hasil berjalan adalah:
Xiao Ming meminta bantuan Xiaohong untuk menghitung: 26549 + 16487 = 43036
Proses eksekusi adalah: Xiao Ming memanggil metode Tambah Xiaohong (supercalculator baru ()) melalui metode CallHelp -nya sendiri, dan merujuk referensi sendiri saat menelepon.
(Ini) meneruskannya sebagai parameter. Setelah Xiaohong menggunakan kalkulator untuk mendapatkan hasilnya, ia memanggil kembali metode pengisian Xiao Ming dan mengisi hasil di ruang di papan tulis.
Lampu dan lampu! Pada titik ini, fungsi panggilan balik secara resmi memulai debutnya. Metode FillBlank Xiao Ming adalah apa yang sering kita callback function.
Dengan cara ini, dapat dilihat dengan jelas bahwa Xiao Ming tidak perlu lagi menunggu sampai penambahan selesai dan hasilnya diisi di papan tulis sebelum ia dapat bersenang -senang dengan teman -temannya. Pekerjaan pengisian-dalam-kosong dilakukan oleh Xiaohong, kalkulator super. Keuntungan dari panggilan balik telah mulai tercermin.
Bab 4. Ibu mertua di pintu
Ada seorang wanita tua dengan rambut abu -abu di pintu masuk taman kanak -kanak. Dia mendirikan kios jalanan di sana menjual beberapa junk food yang hampir kedaluwarsa setiap hari terlepas dari angin dan hujan. Karena saya sudah tua, pikiran saya sedikit bingung dan saya sering tidak tahu berapa banyak uang yang saya hasilkan. Suatu hari, dia secara tidak sengaja mendengar Xiao Ming membual tentang bagaimana dia melawan kecerdasan dan keberanian dengan guru TK dengan bantuan Xiaohong. Jadi, ibu mertua saya memutuskan untuk menemukan Kalkulator Super Kartu Merah Kecil menjadi penolong kecilnya dan memberikan sebungkus strip pedas Weilong sebagai hadiah. Xiaohong tidak bisa menahan godaan dan setuju.
Melihat kembali kode di bab sebelumnya, kami menemukan bahwa parameter yang diperlukan oleh metode Tambah Kalkulator Super Kartu Merah Kecil adalah dua variabel integer dan objek siswa, tetapi wanita tua itu bukan seorang siswa, tetapi vendor kecil, jadi dia harus membuat modifikasi di sini. Dalam hal ini, wajar bagi kita untuk memikirkan warisan dan polimorfisme. Jika kami meminta siswa Xiao Ming dan penjual wanita tua untuk mewarisi dari kelas orang tua, maka kita hanya perlu meneruskan referensi ke kelas induk ke Kalkulator Super Kartu Merah Kecil.
Namun, dalam penggunaan aktual, mengingat warisan tunggal Java dan tidak ingin mengekspos terlalu banyak dengan dirinya sendiri, kami menggunakan metode warisan dari antarmuka untuk bekerja sama dengan kelas internal.
Dengan kata lain, Xiaohong berharap untuk terus memberikan layanan perhitungan kepada anak -anak di kelas di masa depan, dan pada saat yang sama memberikan layanan akuntansi kepada wanita tua, dan bahkan memperluas bisnis orang lain di masa depan. Jadi dia setuju dengan semua pelanggan metode untuk pemrosesan terpadu, yaitu operan yang dia butuhkan dan bagaimana melakukannya setelah menyelesaikan perhitungan. Xiaohong membuat metode terpadu ini menjadi antarmuka dan disediakan untuk semua orang, kodenya adalah sebagai berikut:
dojob antarmuka publik {public void fillblank (int a, int b, int result);} Karena inspirasi datang dari membantu Xiao Ming mengisi kekosongan, Xiaohong mempertahankan niat aslinya dan memperlakukan semua bisnisnya sebagai Fillblank.
Pada saat yang sama, Xiaohong memodifikasi kalkulatornya sehingga dapat menangani orang yang berbeda yang mengimplementasikan antarmuka dojob secara bersamaan. Kodenya adalah sebagai berikut:
Public Class SuperCalculator {public void add (int a, int b, dojob customer) {int result = a + b; customer.fillblank (a, b, hasil);}} Setelah Xiao Ming dan wanita tua itu mendapatkan antarmuka ini, selama mereka menerapkan antarmuka ini, itu setara dengan memberi tahu Xiaohong cara untuk menangani hasil dalam model terpadu, dan menggunakan kelas internal seperti yang disebutkan sebelumnya. Kodenya adalah sebagai berikut:
Xiao Ming's:
public class Student{private String name = null;public Student(String name){// TODO Auto-generated constructor stubthis.name = name;}public void setName(String name){this.name = name;}public class doHomeWork implements doJob{@Overridepublic void fillBlank(int a, int b, int result){// TODO Auto-generated method stubsystem.out.println (name + "mencari perhitungan xiaohong:" + a + " +" + b + "=" + hasil);}} public void callhelp (int a, int b) {new supercalculator (). add (a, b, new dohomework ());}} baru Wanita tua:
Penjual kelas publik {private string name = null; penjual publik (nama string) {// TODO auto-generated constructor stubthis.name = name;} public void setName (name string) {this.name = name;} public class dohomework mengimplementasikan dojob {@overridepublic void fillblank (int a, int a, int reslement {@overridepublic void buang (int a, int a, int a, int a, int a, a, int a, a, int a, a, int a, a, int a, int a, int a, int a, int a, int a, int a, int a, int hance@exren stubsystem.out.println (name + "Mencari bantuan xiaohong untuk menyelesaikan akun:" + a + " +" + b + "=" + hasil + "meta");}} public void callhelp (int a, int b) {new supercalculator (). add (a, b, doHomework baru ()); Prosedur pengujian adalah sebagai berikut:
tes kelas publik {public static void main (string [] args) {int a =; int b =; int c =; int d =; siswa s = siswa baru ("xiao ming"); penjual s = penjual baru ("nenek"); s.callhelp (a, b); s.callhelp (c, d);}} Hasil operasi adalah sebagai berikut:
Xiao Ming meminta bantuan Xiaohong untuk menghitung: 56 + 31 = 87
Wanita tua itu meminta bantuan dari Xiaohong untuk menyelesaikan akun: 26497 + 11256 = 37753 yuan
Kata -kata terakhir
Dapat dilihat dengan jelas bahwa Xiaohong telah memperlakukan masalah ini sebagai karier, dan Anda akan mengetahuinya dengan melihat nama yang dia berikan pada antarmuka dojob.
Beberapa orang mungkin bertanya, mengapa seorang wanita tua bisa menghasilkan banyak uang dengan menyiapkan kios? Apakah ada masalah dengan fokus Anda? Lai Apa yang kita bicarakan di sini adalah mekanisme panggilan balik! Lai
Yang saya tahu adalah bahwa bisnis Xiaohong terus berkembang nanti, dan sebelum lulus dari taman kanak -kanak, dia akhirnya membeli rumah pertamanya dalam hidupnya dengan uang yang dia hasilkan.