import java.util.*;// An interface to be implemented by everyone interested in "Hello" eventsinterfaceHelloListener{void someoneSaidHello();}// Someone who says "Hello"classInitiater{privateList<HelloListener> listeners =newArrayList<HelloListener>();publicvoid addListener(HelloListener toAdd){
listeners.add(toAdd);}publicvoid sayHello(){System.out.println("Hello!!");// Notify everybody that may be interested.for(HelloListener hl : listeners)
hl.someoneSaidHello();}}// Someone interested in "Hello" eventsclassResponderimplementsHelloListener{@Overridepublicvoid someoneSaidHello(){System.out.println("Hello there...");}}classTest{publicstaticvoid main(String[] args){Initiater initiater =newInitiater();Responder responder =newResponder();
initiater.addListener(responder);
initiater.sayHello();// Prints "Hello!!!" and "Hello there..."}}
Apakah ada alasan yang sah stackoverflow.com/suggested-edits/237242 tidak melalui? Ini menunjukkan bagaimana melakukan ini dengan 2 kelas sebagai pertanyaan yang awalnya diajukan.
GlassGhost
2
Bagaimana jika banyak utas membuat acara sumber, apakah ini akan disinkronkan dengan benar?
Mike G
Tergantung pada siruation. Setiap pendengar akan diberitahu sesuai dengan urutan mereka terdaftar. (Btw, saya tidak mengerti apa yang Anda maksud dengan beberapa utas di sini. Kode pendengar akan ditampilkan pada utas yang sama yang menyebabkan peristiwa itu terjadi.)
aioobe
8
@GlassGhost: Ditolak karena pada dasarnya adalah penulisan ulang total. Pengeditan untuk jawaban orang lain baik jika mereka memperbaiki kesalahan ketik dan pemformatan dan tautan rusak dan semacamnya, tetapi mereka tidak boleh mengubah konten secara radikal. (Beberapa pengecualian berlaku untuk posting bertanda "komunitas wiki".)
cHao
1
Apakah java tidak memiliki hal bawaan untuk ini? Saya benar-benar lebih suka melakukan ini dalam pola abstrak, tidak menerapkan untuk loop untuk setiap peristiwa.
Tomáš Zato - Reinstate Monica
27
Yang Anda inginkan adalah implementasi dari pola pengamat . Anda dapat melakukannya sendiri sepenuhnya, atau menggunakan kelas java seperti java.util.Observerdanjava.util.Observable
Throwerdan Catcherdi dalam kelas lain dalam contoh iniTest
CONTOH GITHUB BEKERJA AKU DATANG Default ke Opsi 3, untuk mencoba yang lain cukup batalkan komentar pada Optionalblok kode " " dari kelas yang ingin Anda , dan atur kelas itu sebagai${Main-Class} variabel dalam build.xmlfile:
4 Hal yang diperlukan untuk membuang kode samping:
import java.util.*;//import of java.util.event//Declaration of the event's interface type, OR import of the interface,//OR declared somewhere else in the packageinterfaceThrowListener{publicvoidCatch();}/*_____________________________________________________________*/classThrower{//list of catchers & corresponding function to add/remove them in the listList<ThrowListener> listeners =newArrayList<ThrowListener>();publicvoid addThrowListener(ThrowListener toAdd){ listeners.add(toAdd);}//Set of functions that Throw Events.publicvoidThrow(){for(ThrowListener hl : listeners) hl.Catch();System.out.println("Something thrown");}////Optional: 2 things to send events to a class that is a member of the current class... go to github link to see this code ...}
2 Hal yang diperlukan dalam file kelas untuk menerima acara dari kelas
/*_______________________________________________________________*/classCatcherimplementsThrowListener{//implement added to class//Set of @Override functions that Catch Events@OverridepublicvoidCatch(){System.out.println("I caught something!!");}////Optional: 2 things to receive events from a class that is a member of the current class... go to github link to see this code ...}
@GlassGhost: Masalahnya adalah mainstatis, dan tidak ada yang namanya thisfungsi statis. Anda perlu membuat suatu new Catcher1()tempat, dan meneruskan contoh itu sebagai gantinya. 1.5 juga tidak memungkinkan thisdalam konteks statis; Saya cukup yakin itu tidak pernah diizinkan.
cHao
6
@GlassGhost: Kode yang digunakan thisadalah dalam konstruktor, bukan dalam main. Itu sebabnya ini bekerja. Pindahkan ke main, dan saya jamin tidak. Itulah yang orang coba katakan kepada Anda, dan apa jawaban Anda coba lakukan. Saya tidak peduli apa yang ada di github - saya peduli apa yang ada di SO. Dan apa yang Anda miliki di SO rusak.
cHao
7
@GlassGhost: Saya rasa jawaban Anda tidak memadai secara keseluruhan. Masalah saya melihat dengan itu adalah bahwa kode tidak akan bekerja seperti - Anda mencoba untuk menggunakan thisdari main, yang tidak dapat dikompilasi dalam versi dirilis Jawa. Jika bagian itu ada di konstruktor sebagai gantinya, atau jika mainmembuat new Catcher1()dan menggunakannya this, itu harus bekerja, bahkan dalam 1,6+.
cHao
6
@GlassGhost: "Metode yang dideklarasikan staticdisebut metode kelas. Metode kelas selalu dipanggil tanpa merujuk ke objek tertentu. Upaya untuk mereferensikan objek saat ini menggunakan kata kunci thisatau kata kunci superatau untuk referensi parameter tipe di sekitarnya deklarasi dalam tubuh metode kelas menghasilkan kesalahan waktu kompilasi. " - JLS untuk Java 5, §8.4.3.2
cHao
31
Ini adalah salah satu gaya kode paling aneh yang pernah saya lihat
Eric
4
Berikut ini tidak persis sama tetapi serupa, saya sedang mencari cuplikan untuk menambahkan panggilan ke metode antarmuka, tetapi menemukan pertanyaan ini, jadi saya memutuskan untuk menambahkan cuplikan ini bagi mereka yang mencari seperti saya dan menemukan pertanyaan ini :
Jawaban:
Anda mungkin ingin melihat ke dalam pola pengamat .
Berikut beberapa contoh kode untuk memulai:
Artikel terkait: Java: Membuat acara khusus
sumber
Yang Anda inginkan adalah implementasi dari pola pengamat . Anda dapat melakukannya sendiri sepenuhnya, atau menggunakan kelas java seperti
java.util.Observer
danjava.util.Observable
sumber
Ada 3 cara berbeda yang ingin Anda atur:
Thrower
di dalamCatcher
Catcher
di dalamThrower
Thrower
danCatcher
di dalam kelas lain dalam contoh iniTest
CONTOH GITHUB BEKERJA AKU DATANG Default ke Opsi 3, untuk mencoba yang lain cukup batalkan komentar pada
Optional
blok kode " " dari kelas yang ingin Anda , dan atur kelas itu sebagai${Main-Class}
variabel dalambuild.xml
file:4 Hal yang diperlukan untuk membuang kode samping:
2 Hal yang diperlukan dalam file kelas untuk menerima acara dari kelas
sumber
main
statis, dan tidak ada yang namanyathis
fungsi statis. Anda perlu membuat suatunew Catcher1()
tempat, dan meneruskan contoh itu sebagai gantinya. 1.5 juga tidak memungkinkanthis
dalam konteks statis; Saya cukup yakin itu tidak pernah diizinkan.this
adalah dalam konstruktor, bukan dalammain
. Itu sebabnya ini bekerja. Pindahkan kemain
, dan saya jamin tidak. Itulah yang orang coba katakan kepada Anda, dan apa jawaban Anda coba lakukan. Saya tidak peduli apa yang ada di github - saya peduli apa yang ada di SO. Dan apa yang Anda miliki di SO rusak.this
darimain
, yang tidak dapat dikompilasi dalam versi dirilis Jawa. Jika bagian itu ada di konstruktor sebagai gantinya, atau jikamain
membuatnew Catcher1()
dan menggunakannyathis
, itu harus bekerja, bahkan dalam 1,6+.static
disebut metode kelas. Metode kelas selalu dipanggil tanpa merujuk ke objek tertentu. Upaya untuk mereferensikan objek saat ini menggunakan kata kuncithis
atau kata kuncisuper
atau untuk referensi parameter tipe di sekitarnya deklarasi dalam tubuh metode kelas menghasilkan kesalahan waktu kompilasi. " - JLS untuk Java 5, §8.4.3.2Berikut ini tidak persis sama tetapi serupa, saya sedang mencari cuplikan untuk menambahkan panggilan ke metode antarmuka, tetapi menemukan pertanyaan ini, jadi saya memutuskan untuk menambahkan cuplikan ini bagi mereka yang mencari seperti saya dan menemukan pertanyaan ini :
Penggunaannya adalah sebagai berikut:
sumber