2013-08-07 20 views
5

मैं एक निर्माता पैटर्न बनाने की कोशिश कर रहा हूं जो कुछ तरीकों पर प्रकार की जांच प्रदान करने के लिए जेनेरिक का उपयोग करता है।एनम और बिल्डर पैटर्न से जेनेरिक प्रकार

ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build(); 
ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build(); 
ParameterBuilder.start(Boolean.class).setName(bar).setDefaultValue(false).build(); 

कोड का उपयोग करना:: वर्तमान में मैं अगले कार्य है

public class ParameterBuilder<T> { 
    private String name; 
    private T defaultValue; 

    public static <T2> ParameterBuilder<T2> start(Class<T2> type) { 
    return new ParameterBuilder<T2>(); 
    } 
    // Other methods excluded for example 
} 

तो setDefaultValue विधि के लिए निवेश के प्रकार क्या start विधि में पारित कर दिया है द्वारा परिभाषित किया गया है, बस के रूप में मैं चाहता हूँ।

लेकिन अब मैं थोड़ी अधिक जानकारी रखने के लिए start() में क्या हो रहा है, इसे विस्तारित करना चाहता हूं। अनिवार्य रूप से मैं अपने द्वारा बनाए गए पैरामीटर के लिए "प्रकार" में गुजरना चाहता हूं। कभी कभी इन मानकों "ईमेल", "Url" आदि डिफ़ॉल्ट मान अभी भी एक ज्ञात प्रकार (उन मामलों में स्ट्रिंग) की होगी जैसी चीजों के लिए किया जाएगा, इसलिए मैं कुछ ऐसा करना चाहते हैं:

ParameterBuilder.start(EMAIL).setName("email").setDefaultValue("[email protected]").build(); 
ParameterBuilder.start(URL).setName("website").setDefaultValue("http://www.somewhere.com").build(); 

फिलहाल EMAIL & यूआरएल एनम्स हैं, जिसमें अन्य चीजों के साथ - डिफ़ॉल्ट मान की कक्षा है। लेकिन अगर मैं इस मार्ग पर जाता हूं, तो मैं पैरामीटर बिल्डर को कैसे चालू करूं?

public static <T2> ParameterBuilder<T2> start(ParameterType paramType) { 
    Class<T2> type = paramType.getTypeClass(); 
    // How do I instantiate my ParameterBuilder with the right type? 
} 

यह enums (जो मैं मामले जा रहा है देख सकते हैं) का उपयोग नहीं किया जा सकता है, तो किसी को भी एक अलग समाधान के लिए एक सुझाव है?

+1

आप दिखा सकते हैं वास्तव में क्या 'EMAIL',' URL' है। क्या वे 2 अलग-अलग enums हैं? क्या वे दो enums के उदाहरण हैं? वे क्या हैं? –

+0

मेरे मामले में, मेरे पास पैरामीटर टाइप टाइप था जैसे: 'सार्वजनिक enum पैरामीटर टाइप {STRING (स्ट्रिंग.क्लास, "स्ट्रिंग"), इंटेगर (इंटीजर.क्लास, "इंटीजर"), मल्टीलाइन (स्ट्रिंग.क्लास, "मल्टीन टेक्स्ट"), एचटीएमएल (स्ट्रिंग.क्लास, "एचटीएमएल"), दिनांक (दिनांक.क्लास, "तिथि"), बुलेन (बूलियन.क्लास, "बूलियन"); // विधियों का पालन किया ' –

उत्तर

2

मुझे लगता है कि आपको प्रति वर्ग प्रकार की एक enum की आवश्यकता है (मुझे नहीं लगता कि आप कैसे एक enum कई प्रकार कवर कर सकते हैं और काम को काम करते रहें)। उस स्थिति में, एक सामान्य सामान्य इंटरफ़ेस जो आप चाहते हैं वह कर सकता है। यदि आप मदद करता है तो आप enum स्थिरांक प्रदान करने के लिए कुछ प्रकार का कारखाना बना सकते हैं।

यह संकलित:

static interface ParameterType<T> {} 

static enum ParameterTypeEnum implements ParameterType<String> { EMAIL; } 

public static void main(String[] args) { 
    ParameterBuilder 
      .start(ParameterTypeEnum.EMAIL) 
      .setName("email") 
      .setDefaultValue("[email protected]") 
      .build(); 
} 

public static class ParameterBuilder<T> { 

    private String name; 
    private T defaultValue; 

    public static <T2> ParameterBuilder<T2> start(ParameterType<T2> paramType) { 
     return new ParameterBuilder<T2>(); 
    } 

    ParameterBuilder<T> setName(String name) { 
     this.name = name; 
     return this; 
    } 

    ParameterBuilder<T> setDefaultValue(T defaultValue) { 
     this.defaultValue = defaultValue; 
     return this; 
    } 

    void build() {} 
} 
+0

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

0

मुझे यकीन नहीं है कि आप इसका उपयोग किस संदर्भ में करना चाहते हैं, लेकिन मुझे लगता है कि निम्नलिखित एक विकल्प हो सकता है।

आप ओपन/क्लोज़ेड सिद्धांत का पालन कर सकते हैं और इंटरफ़ेस Parameter बना सकते हैं और प्रति प्रकार एक कार्यान्वयन कर सकते हैं। इसका लाभ यह है कि आपको अपने इच्छित प्रत्येक नए पैरामीटर के लिए एक नया एनम मूल्य जोड़ने की आवश्यकता नहीं है। बाद में आप कक्षा को ParameterBuilder पर एनम के बजाय पास कर सकते हैं और ParameterBuilder और Parameter आपको जो चाहिए उसे बनाने के लिए मिलकर काम करेगा।

तो ParameterBuilder.start() विशिष्ट Parameter का एक उदाहरण लौटा सकता है और पैरामीटर के पैरामीटर के प्रकार के आधार पर पैरामीटर में विभिन्न विधियां हो सकती हैं।

मुझे नहीं लगता कि यह उत्तर वास्तव में अच्छा है, लेकिन उम्मीद है कि आपको अपने संदर्भ के लिए संभावित समाधान कैसे बनाया जाए, इस बारे में एक संकेत दे सकता है।

0

आप इन ईमेल और यूआरएल प्रकार

public class DefaultType { 
    protected String name; 
    protected String defaultValue; 
    //some constructor 
} 

public class EmailType extends DefaultType { 
    ... 
} 

public class URLType extends DefaultType { 
    ... 
} 

के लिए एक वस्तु hierachie बना सकते हैं तो पैरामीटर बिल्डर कुछ इस तरह दिखाई दे सकता है:

public static ParameterBuilder start(DefaultType type) { 
    ParameterBuilder builder = new ParameterBuilder(type); 
    builder.setType(type); 
    return builder; 
} 

तो फिर तुम इसे इस तरह कह सकते हैं:

ParameterBuilder.start(new EmailType("name","value");... 

क्या यह सहायता करता है या आप इस दिशा में जाना चाहते हैं?

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