मैं जावा में कुछ ऐसा करना चाहता हूं लेकिन मुझे इसका तरीका नहीं पता है:
जब घटना "ऑब्जेक्ट 1 कहते हैं कि 'हैलो' होता है, तो ऑब्जेक्ट 2" हैलो "कहकर उस घटना का जवाब देता है।
क्या कोई मुझे संकेत या नमूना कोड दे सकता है?
मैं जावा में कुछ ऐसा करना चाहता हूं लेकिन मुझे इसका तरीका नहीं पता है:
जब घटना "ऑब्जेक्ट 1 कहते हैं कि 'हैलो' होता है, तो ऑब्जेक्ट 2" हैलो "कहकर उस घटना का जवाब देता है।
क्या कोई मुझे संकेत या नमूना कोड दे सकता है?
जवाबों:
आप शायद पर्यवेक्षक पैटर्न को देखना चाहते हैं ।
अपने आप को आरंभ करने के लिए यहां कुछ नमूना कोड दिए गए हैं:
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.util.Observer
और का उपयोग कर सकते हैंjava.util.Observable
3 अलग-अलग तरीके हैं जिनसे आप इसे स्थापित करना चाह सकते हैं:
Thrower
का भीतर Catcher
Catcher
का भीतर Thrower
Thrower
और Catcher
इस उदाहरण में एक और वर्ग के अंदरTest
विकल्प 3 में काम कर रहे GITHUB EXMPLE I AM CITING डिफ़ाल्ट्स को विकल्प 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
, और मैं इसकी गारंटी नहीं दूंगा। यही लोग आपको बताने की कोशिश कर रहे हैं, और आपका जवाब क्या करने की कोशिश कर रहा है। मैं एक धिक्कार नहीं देता कि जीथब पर क्या है - मुझे परवाह है कि एसओ क्या है। और एसओ पर जो आपके पास है वह टूट गया है।
this
से main
, जो जावा के किसी भी जारी किया संस्करण में संकलित नहीं होंगे। यदि वह हिस्सा इसके बजाय एक कंस्ट्रक्टर में था, या यदि main
बनाया गया था new Catcher1()
और इसका उपयोग किया गया था this
, तो उसे 1.6+ में भी काम करना चाहिए।
static
जाता है उसे एक वर्ग विधि कहा जाता है। एक वर्ग विधि हमेशा किसी विशेष वस्तु के संदर्भ के बिना आह्वान की जाती है। कीवर्ड this
या कीवर्ड का उपयोग करके वर्तमान वस्तु को संदर्भित करने का प्रयास super
या किसी भी आसपास के प्रकार के मापदंडों को संदर्भित करने के लिए। एक क्लास पद्धति के शरीर में घोषणा एक संकलन-समय त्रुटि का परिणाम है। " - जावा 5 के लिए JLS, §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) {
}
});