7

में स्विच मामले में बयान से बचने के लिए मैं कैसे TriggerType है, जहां विभिन्न चलाताजावा

public enum TriggerType { 
    meta,data,list,toggle 
} 

ये ट्रिगर प्रकार जोड़ा जा सकता है विभिन्न संचालकों (जैसे घटक, डैशबोर्ड आदि) के अंदर उपयोग किया जाता है की पहचान करने के लिए एक enum है जो ट्रिगर ComponentHandler का उदाहरण के कोड स्निपेट स्विच-केस ट्रिगर का उपयोग के लिए, एक स्विच-केस हैंडलर के अंदर शुरू हो रहा है कल्पना कीजिए मैं एक नया ट्रिगर जोड़ना चाहते हैं तो नीचे दिए गए

@Override 
public TriggerResultInterface executeTriggerJob(TriggerEventHelper triggerEventHelper) throws TriggerHandlerException { 
    switch (triggerEventHelper.getTriggerName()) { 
     case meta: 
      return getMetaComponentConfig(triggerEventHelper); 
     case data: 
      return getComponentData(triggerEventHelper); 
     default: 
      LOGGER.debug(INVALID_TRIGGER_NAME_CONFIGURED); 
      throw new TriggerHandlerException(INVALID_TRIGGER_NAME_CONFIGURED); 
    } 

} 

दिया जाता है, मैं enum अपडेट करना पड़ता है कक्षा जो अपरिहार्य है, एक ही समय में मेरे पास है मेरे प्रत्येक हैंडलर कक्षाओं को अद्यतन करने के लिए जो ट्रिगर का उपयोग करने की आवश्यकता है, क्या कोडिंग के साथ डिज़ाइन का यह तरीका अच्छा है या क्या कोई अन्य बेहतर समाधान है जो इस कोड को बढ़ाएगा और बेहतर डिजाइन के साथ सोलिड सिद्धांतों का पालन करेगा।

मैं यह कहने पर जोर देना चाहूंगा कि यह प्रश्न this का डुप्लिकेट नहीं है। प्रत्येक स्थिति के लिए उस स्थिति में केवल एक व्यवहार की आवश्यकता होती है (उदाहरण: convertToMp3)। लेकिन मेरा सवाल यह है कि मेरा एनम प्रकार (ट्रिगर टाइप) हैंडलर पर निर्भर है जिसका उपयोग संभवतः किया जा सकता है, इसलिए प्रत्येक ट्रिगर प्रकार एनम का व्यवहार या कार्यान्वयन उस हैंडलर की आवश्यकता पर निर्भर करेगा जिसका उपयोग किया जा रहा है।

+0

कमांड पैटर्न आपके उपयोग के मामले में फिट हो सकता है, लेकिन जैसा कि मैंने इसे कार्यान्वित किया है, अभी भी एक कमांड स्टेटमेंट है जो यह पता लगाने के लिए है कि कौन सा आदेश आमंत्रित करना है। –

+1

प्रत्येक मान के लिए ओवरराइड के साथ, Enum के अंदर विधि (ओं) रखो। मुझे लगता है कि ऐसा करने में सीमित मूल्य है, क्योंकि आपको प्रत्येक विधि के लिए विभिन्न प्रकार के बाहरी संदर्भ प्रदान करना पड़ता है, जो कि अकेले खड़े होने की क्षमता को नष्ट कर देता है, लेकिन यदि आप उस नुकसान को सीमित कर सकते हैं तो यह एक उपयोगी तकनीक हो सकती है। – EJP

+2

[उत्तर मैंने लिखा] [http://stackoverflow.com/a/39045135/2398375) आज आपके लिए संदर्भ हैंडलर के बारे में, इस तरह आप इसे कैसे करेंगे –

उत्तर

3

समाधान में से एक ट्रिगर्स को अलग-अलग संभालने के लिए बहुरूपता का उपयोग करना है। उदाहरण के लिए, आप Trigger इंटरफ़ेस घोषित कर सकते हैं और कई कार्यान्वयन कर सकते हैं। इस मामले में, जब आप एक नया ट्रिगर प्रकार की जरूरत है, तो आप सिर्फ इस इंटरफेस को लागू करने और मौजूदा कोड को छूने नहीं है:

public interface Trigger { 
    TriggerResultInterface execute(TriggerEventHelper eventHelper); 
} 

public class MetaTrigger implements Trigger { 
    @Override 
    TriggerResultInterface execute(TriggerEventHelper eventHelper) { 
     // do meta trigger work here 
    } 
} 

public class DataTrigger implements Trigger { 
    @Override 
    TriggerResultInterface execute(TriggerEventHelper eventHelper) { 
     // do data trigger work here 
    } 
} 

// ... 

public TriggerResultInterface executeTriggerJob(TriggerEventHelper eventHelper) { 
    eventHelper.getTrigger().execute(eventHelper); 
} 

इस मामले में यह एक नया ट्रिगर प्रकार जोड़ने के लिए असंभव हो जाएगा और नहीं लागू इसकी व्यवहार।

यदि आपको डिफ़ॉल्ट कार्यान्वयन की आवश्यकता है, तो आप इंटरफ़ेस के बजाय बेस क्लास का उपयोग कर सकते हैं (जावा 8 में आप इंटरफ़ेस में डिफ़ॉल्ट कार्यान्वयन को जोड़ सकते हैं)।