का उपयोग करके कुछ मदद की ज़रूरत है, मैं ऑब्जर्वर पैटर्न के समान, मेरे एप्लिकेशन में होने वाली घटनाओं का जवाब देने के लिए एक सिस्टम बनाने की कोशिश कर रहा हूं। अपने सिस्टम में, EventProducer
रों ट्रिगर घटनाओं और EventConsumer
रों उन घटनाओं पर प्रतिक्रिया दें और दो एक केंद्रीय हब के माध्यम से जुड़े हुए हैं:जावा जेनरिक
पल के लिए, मैं EventProducer
ध्यान न दें और EventHub
और EventConsumer
पर ध्यान केंद्रित करने जा रहा हूँ:
interface EventConsumer<E extends Event> {
void respondToEvent(E event);
}
class EventHub {
private HashMap<Class</*event type*/>, HashSet<EventConsumer</*event type*/>>> subscriptions;
public <E extends Event> void fireEvent(E event) {
/* For every consumer in the set corresponding to the event type {
consumer.respondToEvent(event);
} */
}
public <E extends Event> void subscribeToEvent(EventConsumer<E> consumer) {
/* Insert consumer into the set corresponding to E */
}
}
समस्या
HashMap
की घोषणा में निहित है: मैं
HashMap<Class<E extends Event>, HashSet<EventConsumer<E>>>
// or
<E extends Event> HashMap<Class<E>, HashSet<EventConsumer<E>>>
की तरह कुछ करने के लिए सक्षम होना चाहते हैं
तो EventConsumer
एक ही प्रकार Class
है द्वारा parameterized है, लेकिन सबसे करीब मैं प्राप्त कर सकते हैं
HashMap<Class<? extends Event>, HashSet<EventConsumer<? extends Event>>>
है लेकिन तब यह एक HashSet<EventConsumer<MouseClickEvent>>
तरह बातें Class<KeyPressEvent>
करने के लिए आवंटित किया जा रहा की अनुमति होगी, दोनों KeyPressEvent
और MouseClickEvent
उपवर्ग यह सोचते हैं कि Event
।
एक दूसरी समस्या subscribeToEvent
में है: मैं उपभोक्ता
subscriptions.get(E.class).put(consumer)
में की तरह, सही सेट अपने घटना के लिए इसी में स्टोर करने के लिए सक्षम होना चाहिए, लेकिन मैं रन-टाइम में ई की श्रेणी नहीं मिल सकता है ।
मैं इन समस्याओं को कैसे हल कर सकता हूं? क्या मैं इस बारे में गलत तरीके से जा रहा हूं?
असल में, मुझे यह दृष्टिकोण पसंद है। मूल रूप से, मैं 'क्लास कुछ कॉन्स्यूमर इम्प्लमेंट्स इवेंट कॉन्स्यूमर, इवेंट कॉन्स्यूमर ' जैसी कुछ करने में सक्षम होना चाहता था, लेकिन स्पष्ट रूप से आप ऐसा नहीं कर सकते (जो मुझे लगता है)।क्या कोई जवाब है कि मैं किसी उपभोक्ता पर 'EventToEvent' में स्विच से बचने के लिए 'ईवेंट' पॉलिमॉर्फिज्म का कुछ रूप प्राप्त कर सकता हूं? 'शून्य प्रतिक्रिया की तरह (ClickEvent) की तरह; शून्य जवाब ToEvent (KeyPressEvent); '? –
@AustinHyde मुझे नहीं पता। मैं इसके साथ खेल रहा था, लेकिन मुझे 'EventHub' में सभी जेनेरिक भ्रम पैदा किए बिना ऐसा करने का अच्छा तरीका नहीं मिला। आपको कोड की पठनीयता पर भी विचार करना चाहिए। यहां तक कि अगर यह चीजों को थोड़ा अक्षम करता है, अगर समय के साथ बनाए रखना आसान है, तो मुझे लगता है कि यह इसके लायक है (जब तक कि आप कंप्यूटर गेम या सर्च इंजन या कुछ मिलिसेकंड की गणना नहीं करते)। मेरे लिए, वे सभी जेनेरिक कोड को पढ़ने और समझने के लिए कठिन बनाते हैं। – Michael