2010-11-27 20 views
5

के साथ श्रृंखला-जिम्मेदारी हैंडलर मैं जावा में जिम्मेदारी डिजाइन-पैटर्न की श्रृंखला का उपयोग कर रहा हूं। पूरी तरह से श्रृंखला कुछ प्रकार की वस्तुओं के लिए एक अनुरोध का प्रतिनिधित्व करता है। श्रृंखला में प्रत्येक "हैंडलर" 1 प्रकार की अनुरोधित इकाइयों को संभालने के लिए ज़िम्मेदार है। सभी अनुरोधों को अनिवार्य रूप से उसी तरह से संभाला जाता है इसलिए मैंने "हैंडलर" -क्लास जेनेरिक बनाने की कोशिश की।जावा जेनेरिक

public class Handler<T>{ 
    int required; 
    Handler<?> next; 

    public void handle(Object O){ 
     if(o instanceof T){ 
     required --; 
     }else{ 
     next.handle(o); 
     } 
    } 
} 

समस्या यह है कि इस तरह की एक instanceof असंभव है: तो हैंडल श्रेणी में मैं इस तरह एक विधि (हैंडलिंग ही सरल है क्योंकि यह केवल मेरी समस्या अंधेरा करना होगा) की जरूरत है। क्योंकि टाइप टी को रन टाइम के दौरान स्पष्ट रूप से संग्रहीत नहीं किया जाता है (या इंटरनेट पर मेरे शोध के दौरान मुझे यही समझा जाता है)। तो मेरा सवाल है: सबसे अच्छा विकल्प क्या है?

उत्तर

2

जेनरिक का उपयोग कर संचालकों को लागू वर्ग हैंडलर का समर्थन करता है परिभाषित करने के लिए एक निर्माता पैरामीटर का उपयोग करके:

public class Handler<T> { 
    private int required; 
    private Handler<?> next; 
    private Class<? extends T> c; 

    public Handler(Class<? extends T> c) { 
     this.c = c; 
    } 

    public void handle(Object o) { 
     if (c.isInstance(o)) { 
      required--; 
     } else { 
      next.handle(o); 
     } 
    } 

    // ... 
}  
+0

वास्तव में .... यह उच्च ऑब्जेक्ट स्तर के लिए काम करता है, लेकिन जेनिक्स संकलन समय पर विधि हस्ताक्षर में 'ऑब्जेक्ट' के लिए डिफ़ॉल्ट लगता है। वैसे भी। दूसरा समाधान हटा दिया गया है, लेकिन पहला समाधान अभी भी अच्छा है जो आप –

+0

प्राप्त करने की कोशिश कर रहे हैं, यह समाधान के निकटतम है, जिसे मैं प्राप्त करना चाहता था, धन्यवाद। अब मैं सामान्य भाग छोड़ सकता हूं, क्योंकि मैं कक्षा के साथ सब कुछ एक तर्क के रूप में कर सकता हूं – Ingdas

1

यह बदसूरत हो सकता है, लेकिन आप की कोशिश कर सकते इस:

public abstract class Handler { 
    int required; 
    Handler next; 

    public void handle(Object o){ 
     if(getMyClass().isInstance(o)){ 
     required --; 
     }else{ 
     next.handle(o); 
     } 
    } 

    protected abstract Class getMyClass(); 
} 
+0

+1 - यह काम करता है, और यह वास्तव में वह सब बदसूरत नहीं है। –

+0

'java.lang.Object' पर 'public' के रूप में परिभाषित' getClass' नहीं है? ऐसा लगता है कि आप इसे एक कठिन पहुंच स्तर के साथ ओवरराइड करने का प्रयास कर रहे हैं। –

+0

और अगर आप कोई अन्य नाम चुनें, तो 'Class' एक प्रकार पैरामीटर होना चाहिए:' संरक्षित सार कक्षा getHandledValueType(); ' –

1

ऐसा लगता है कि आप वास्तव में, सब पर एक श्रृंखला उपयोग नहीं कर रहे हैं जब तक आप कुछ मामलों है जहां दोनों आधार और उप वर्गों बंद घटनाओं किक । कि जब तक हिस्सा लागू नहीं होता है, तो आप

Map<Class, Handler> handlers = //...initialize however 

की तरह है और जड़ हैंडलर में कुछ कर सकते हैं:

public void handle(Object o) { 
handlers.get(o.getClass()).handle(o); 
} 
0

यह मतलब नहीं है कोई हैंडलर जेनरिक का उपयोग कर के लिए अगर आप पर संभाल फोन हर वस्तु। या तो आप इस तरह के प्रकार के लिए एक हैंडलर का दृष्टांत:

public class Handler<T>{ 
    int required; 
    Handler<?> next; 

    public void handle(T O){ 
    ... 
    } 
} 

या आप एक अमूर्त वर्ग हैंडलर को परिभाषित करने और विशिष्ट प्रकार संभाल करने के लिए विशिष्ट उपवर्ग या सिर्फ श्रृंखला के लिए घटना पारित। इसके अलावा

if(x.isInstance(o)) {...} 

का उपयोग कर वास्तव में एक antipattern है और आप OOP नियम तोड़ सकते हैं।

संबंधित मुद्दे