ฉันต้องการทำสิ่งนี้ใน Java แต่ฉันไม่รู้วิธี:
เมื่อเหตุการณ์ "object 1 พูดว่า 'hello'" จะเกิดขึ้นดังนั้น object 2 จะตอบกลับเหตุการณ์นั้นโดยพูดว่า "hello"
ใครสามารถให้คำแนะนำหรือตัวอย่างรหัสแก่ฉันได้หรือไม่
ฉันต้องการทำสิ่งนี้ใน Java แต่ฉันไม่รู้วิธี:
เมื่อเหตุการณ์ "object 1 พูดว่า 'hello'" จะเกิดขึ้นดังนั้น object 2 จะตอบกลับเหตุการณ์นั้นโดยพูดว่า "hello"
ใครสามารถให้คำแนะนำหรือตัวอย่างรหัสแก่ฉันได้หรือไม่
คำตอบ:
คุณอาจต้องการที่จะมองเข้าไปในรูปแบบการสังเกตการณ์
นี่คือตัวอย่างรหัสบางส่วนเพื่อให้คุณเริ่มต้นได้ด้วยตนเอง:
import java.util.*;
// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
void someoneSaidHello();
}
// Someone who says "Hello"
class Initiater {
private List<HelloListener> listeners = new ArrayList<HelloListener>();
public void addListener(HelloListener toAdd) {
listeners.add(toAdd);
}
public void sayHello() {
System.out.println("Hello!!");
// Notify everybody that may be interested.
for (HelloListener hl : listeners)
hl.someoneSaidHello();
}
}
// Someone interested in "Hello" events
class Responder implements HelloListener {
@Override
public void someoneSaidHello() {
System.out.println("Hello there...");
}
}
class Test {
public static void main(String[] args) {
Initiater initiater = new Initiater();
Responder responder = new Responder();
initiater.addListener(responder);
initiater.sayHello(); // Prints "Hello!!!" and "Hello there..."
}
}
บทความที่เกี่ยวข้อง: Java: การสร้างเหตุการณ์ที่กำหนดเอง
สิ่งที่คุณต้องการคือการนำรูปแบบการสังเกตมาใช้ คุณสามารถทำได้ด้วยตัวเองโดยสมบูรณ์หรือใช้คลาส Java เช่นjava.util.Observer
และjava.util.Observable
มี 3 วิธีที่คุณอาจต้องการตั้งค่านี้:
Thrower
ด้านในของ Catcher
Catcher
ด้านในของ Thrower
Thrower
และCatcher
ภายในคลาสอื่นในตัวอย่างนี้Test
ตัวอย่างการทำงานของ GITHUB ฉันกำลังอ้างอิงค่าเริ่มต้นของตัวเลือกที่ 3 เพื่อลองให้คนอื่นเพียงแค่ใส่เครื่องหมายOptional
บล็อก"" ของคลาสที่คุณต้องการเป็นหลักและตั้งค่าคลาสนั้นเป็น${Main-Class}
ตัวแปรในbuild.xml
ไฟล์:
4 สิ่งที่จำเป็นในการขว้างรหัสด้านข้าง:
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 package
interface ThrowListener {
public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
List<ThrowListener> listeners = new ArrayList<ThrowListener>();
public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
//Set of functions that Throw Events.
public void Throw(){ 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 สิ่งที่จำเป็นในไฟล์คลาสเพื่อรับเหตุการณ์จากคลาส
/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
@Override public void Catch() {
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 . . .
}
main
เป็นแบบคงที่และไม่มีสิ่งเช่นthis
ในฟังก์ชั่นคงที่ คุณต้องสร้างnew Catcher1()
ที่ไหนสักแห่งและส่งต่ออินสแตนซ์นั้นแทน 1.5 ไม่อนุญาตthis
ในบริบทแบบคงที่เช่นกัน ฉันค่อนข้างแน่ใจว่ามันไม่เคยได้รับอนุญาต
this
main
นั่นเป็นเหตุผลที่มันทำงาน ย้ายไปที่main
และฉันรับประกันว่าจะไม่ นั่นคือสิ่งที่ผู้คนพยายามบอกคุณและสิ่งที่คำตอบของคุณพยายามทำ ฉันไม่ให้อะไรกับ gitub ห่า - ฉันแคร์อะไรในนั้น และสิ่งที่คุณมีใน SO นั้นแตกหัก
this
จากmain
ซึ่งจะไม่รวบรวมใน Java รุ่นที่วางจำหน่าย หากส่วนนั้นอยู่ในตัวสร้างแทนหรือถ้าmain
สร้างnew Catcher1()
และใช้แทนแทนที่จะเป็นแบบthis
นั้นก็ควรใช้งานได้แม้ใน 1.6+
static
ถูกเรียกว่าวิธีการเรียนวิธีการเรียนมักจะเรียกโดยไม่ต้องอ้างอิงถึงวัตถุเฉพาะความพยายามที่จะอ้างอิงวัตถุปัจจุบันโดยใช้คำหลักthis
หรือคำหลักsuper
หรือการอ้างอิงพารามิเตอร์ประเภทของรอบใด ๆ การประกาศในเนื้อความของเมธอดคลาสส่งผลให้เกิดข้อผิดพลาดในการคอมไพล์เวลา " - JLS สำหรับ Java 5, §8.4.3.2
ต่อไปนี้ไม่เหมือนกัน แต่คล้ายกันฉันค้นหาตัวอย่างเพื่อเพิ่มการเรียกไปยังวิธีการอินเทอร์เฟซ แต่พบคำถามนี้ดังนั้นฉันจึงตัดสินใจเพิ่มตัวอย่างนี้สำหรับผู้ที่กำลังค้นหามันเช่นฉันและพบคำถามนี้ :
public class MyClass
{
//... class code goes here
public interface DataLoadFinishedListener {
public void onDataLoadFinishedListener(int data_type);
}
private DataLoadFinishedListener m_lDataLoadFinished;
public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
this.m_lDataLoadFinished = dlf;
}
private void someOtherMethodOfMyClass()
{
m_lDataLoadFinished.onDataLoadFinishedListener(1);
}
}
การใช้งานมีดังนี้:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});