enums

2011-11-21 32 views
7

के बीच साझा विधियां मैं दो नए enums में एक emun refactor करना चाहता हूं, लेकिन मैं सभी नए enums में enum विधियों की प्रतिलिपि/पेस्ट करना पसंद नहीं है।enums

enum EmailType { 
    REMINDER_ADMIN('reminderForAdmin') 
    REMINDER_PRODUCTION('reminderForProduction') 
    REMINDER_MANAGEMENT('reminderForManagement') 
    REMINDER_CUSTOMER('reminderForCustomer') 

    private final propertiesIdentifier 

    String getTemplate(type) { 
     ... 
    } 

    String getFrom(type) { 
     ... 
    } 

    String getTo(type) { 
     ... 
    } 

    String getBcc(type) { 
     ... 
    } 

    ... 
} 

यह केवल एक बार के तरीकों को लागू करता है और कई enums में उपयोग करने के लिए संभव है? के बाद से सभी enums स्वचालित रूप से Enum नामित वर्ग का विस्तार

enum EmailTypeAdministration { 
    REMINDER_ADMIN('reminderForAdmin') 
    REMINDER_PRODUCTION('reminderForProduction') 

    ... 
} 

enum EmailTypeClients { 
    REMINDER_MANAGEMENT('reminderForManagement') 
    REMINDER_CUSTOMER('reminderForCustomer') 

    ... 
} 
+1

ऐसा लगता है कि यह संभव नहीं है, लेकिन आपके enums एक ही इंटरफ़ेस को कार्यान्वित कर सकते हैं, ताकि आप इंटरफ़ेस पर विधियों तक पहुंच सकें। – Stephan

उत्तर

2

अंत में Mixin solution काम नहीं करता है क्योंकि @Mixin एनोटेशन केवल enums के बजाय कक्षाओं के साथ काम करता है।

मैं प्रतिनिधि के साथ एक समान दृष्टिकोण का उपयोग करता हूं। Delegate transformation ठीक काम करता है! कारखाने या सिंगलटन पैटर्न के साथ EnumUtils का उपयोग करने के लिए यह कोड सुधार किया जा सकता है।

class EnumUtils { 
    String getTemplate(type) { 
     "template" + type  
    } 

    String getFrom(type) {   
    } 

    String getTo(type) {   
    } 

    String getBcc(type) {   
    } 
} 

enum EmailTypeAdministration { 
    REMINDER_ADMIN('reminderForAdmin'), 
    REMINDER_PRODUCTION('reminderForProduction') 

    @Delegate EnumUtils enumUtils = new EnumUtils() 
    EmailTypeAdministration(str) {} 
} 

enum EmailTypeClients { 
    REMINDER_MANAGEMENT('reminderForManagement'), 
    REMINDER_CUSTOMER('reminderForCustomer') 

    @Delegate EnumUtils enumUtils = new EnumUtils() 
    EmailTypeClients(str) {} 
} 

EmailTypeAdministration emailTypeAdmin = EmailTypeAdministration.REMINDER_ADMIN 
assert 'templateParam' == emailTypeAdmin.getTemplate('Param') 
+0

मिश्रण समाधान काम करता है –

2

Enums किसी अन्य वर्ग का विस्तार नहीं कर सकते हैं। तो, आपका एकमात्र विकल्प अलग-अलग उपयोगिता के लिए विधियों के कार्यान्वयन को प्रतिनिधि करना है। कार्यान्वयन छोटा नहीं है (एक से अधिक पंक्ति) यदि यह प्रासंगिक हो सकता है। अन्यथा प्रतिनिधिमंडल आपको गंभीर लाभ नहीं देता है।

अन्य संभावना मैन्युअल रूप से एनम का विस्तार करना है, लेकिन मैं valueOf(), values() आदि जैसे वर्बोज कोड लिखने के लिए तैयार हूं, इसलिए मुझे यकीन नहीं है कि आपको वास्तव में इसकी आवश्यकता है।

संपादित करें:

मेरे लेख के बारे में Hierarchical Enums पर एक नजर डालें। यह शायद आपकी मदद भी कर सकता है।

+0

धन्यवाद, मैं ग्रोवी का उपयोग कर रहा हूं और [प्रतिनिधि परिवर्तन] के साथ एक पंक्ति में कार्यान्वित कर सकता हूं (http://groovy.codehaus.org/Delegate+transformation) –

9

जैसा कि मेरे पुराने दोस्त Clippy कहेंगे, "ऐसा लगता है कि आप ग्रोवी का उपयोग कर रहे हैं"। यदि ऐसा है, तो आप दोनों enums के लिए सामान्य तरीकों को जोड़ने के लिए एक मिश्रण का उपयोग कर सकते हैं।

// This class holds the methods that will be mixed-in to the enums 
class EnumUtils { 
    String getTemplate(type) { 
     "template" + type  
    } 

    String getFrom(type) {   
    } 

    String getTo(type) {   
    } 

    String getBcc(type) {   
    } 
} 

// This annotation adds the common methods to the enum 
@Mixin(EnumUtils) 
enum EmailTypeAdministration { 
    REMINDER_ADMIN('reminderForAdmin'), 
    REMINDER_PRODUCTION('reminderForProduction') 

    EmailTypeAdministration(str) {} 
} 

// This annotation adds the common methods to the enum 
@Mixin(EnumUtils) 
enum EmailTypeClients { 
    REMINDER_MANAGEMENT('reminderForManagement'), 
    REMINDER_CUSTOMER('reminderForCustomer') 

    EmailTypeClients(str) {} 
} 

// Quick test to prove the methods exist and return the expected values 
EmailTypeAdministration emailTypeAdmin = EmailTypeAdministration.REMINDER_ADMIN 
assert 'templateParam' == emailTypeAdmin.getTemplate('Param') 

आप के रूप में विज्ञापित

+0

मैं इसे चलाने के लिए नहीं मिल सकता ... यह कौन सा संस्करण है के तहत काम कर रहे हैं? –

+0

@tim_yates groovy console 1.8 में मेरे लिए काम करता है।2 –

+0

दिलचस्प, मुझे लगता है कि @Delegate –

0

यह काम करता है साबित करने के लिए Enum प्रकार ऐसा नहीं कर सकते ग्रूवी कंसोल में उपरोक्त कोड चला सकते हैं लेकिन आप एक इंटरफेस के साथ ग्रूवी Mixin रों या एक कारखाने का उपयोग कर सकते हैं:

  1. enums में, केवल स्थिरांक को परिभाषित करें। सभी enums एक आम मार्कर इंटरफ़ेस को लागू करना होगा।
  2. एक ऐसा कारखाना बनाएं जो मार्कर इंटरफ़ेस को स्वीकार करता है और गेटर्स को शामिल करता है।

कारखाना दृष्टिकोण आपको कॉन्फ़िगरेशन फ़ाइल (जैसे टेम्पलेट्स, ईमेल पते) को कॉन्फ़िगरेशन फ़ाइल में स्थानांतरित करने की अनुमति देता है, जिसे कारखाने स्टार्टअप पर पढ़ता है।

सबक: विन्यास में कॉन्फ़िगरेशन न रखें। Enums स्थिरांक हैं। कॉन्फ़िगरेशन परिवर्तन।