2012-04-18 3 views
6

मैंने एक enum बनाया है और मैं अपने enum को एक String.format ऑपरेशन का समर्थन करने की अनुमति देने की कोशिश कर रहा हूं जो असीमित संख्या में पैरामीटर एक स्ट्रिंग लौटाता है। मैं केवल एक वस्तु वापस करने में कामयाब रहा और इस विधि का उपयोग करने के बाद मुझे toString()/कास्टिंग करना है। मुझे लगता है कि ऐसा करने के लिए एक और "साफ" तरीका है, या शायद toString() विधि को बेहतर ओवरराइड करने के लिए। असल में, मैं toString() विधि का समर्थन करना चाहता था लेकिन दुख की बात यह नहीं थी कि मैंने ऐसा किया है इसलिए मैंने इस विधि को बनाया है। जैसा कि आप देख सकते हैं कि इसका नाम text(..) है और toString() नहीं है।जावा: enum toString()

मैं इसे बेहतर कैसे कर सकता हूं? आदर्श समाधान जो मैं चाहता था वह toString(..) जैसा था जो स्ट्रिंग देता है।

public enum MY_ENUM { 

    VALUE_A("aaa %s"), VALUE_B("bbb %s"); 

    private String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String text() { 
     return this.text; 
    } 

    public Object text(final Object... o) { 
     return new Object() { 
      @Override 
      public String toString() { 
       return String.format(text(), o); 
      } 
     }; 
    } 
} 
+3

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

+1

यह विधि आपके enum से संबंधित कैसे है? आप इसे वास्तव में वापस लौटना चाहते हैं? – darrengorman

+0

मैंने अपना कोड बढ़ाया, मैं कुछ दिए गए स्ट्रिंग पैरा के साथ एक ToString() विधि का समर्थन करने की कोशिश कर रहा हूं .. – Popokoko

उत्तर

9

मैं देख रहा हूँ कि आप कहां जा रहे हैं ... मैं इस बारे में सोच रहा है कि आप क्या चाहते (परीक्षण किया है, और यह काम करता है):

public String toString(Object... o) { 
    return String.format(text, o); 
} 

देखने के एक डिजाइन बिंदु के लिए, मैं होता नहीं पाठ को प्रकाशित करें (यानी गेटटर है) जब तक कि आपको वास्तव में आवश्यकता न हो - तथ्य यह है कि text प्रारूप स्ट्रिंग के रूप में उपयोग किया जाता है, एक कार्यान्वयन विकल्प है। मैं बस यह करूँगा:

public static enum MY_ENUM { 

    VALUE_A("aaa %s bbb %s"), 
    VALUE_B("bbb %s"); 

    private final String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String toString(Object... o) { 
     return String.format(text, o); 
    } 
} 

एक तरफ, मुझे वास्तव में कक्षा का विचार पसंद है। इसे पहले नहीं देखा है।

+0

ग्रेट सॉल्यूशन, पूरी तरह से काम करता है, एर्म, मैं वास्तव में इसे हल करने के करीब था, बहुत बहुत धन्यवाद! – Popokoko

+0

मुझे यह विचार भी पसंद है, हालांकि मैं 'anEnumValue.format (ऑब्जेक्ट ओ)' जैसे फ़ंक्शन का उपयोग करने का पक्ष लेगा। मेरे लिए, 'toString' को enum value के स्ट्रिंग प्रस्तुति को वापस करना चाहिए, इसलिए 'VALUE_A' "aaa bbb " जैसा होगा। – thecoshman

+0

@thecoshman जो 'toString()' * के बिना * पैरामीटर (यानी ऑब्जेक्ट के इम्प्रोइड को ओवरराइड करना) के सत्य है, लेकिन * पैरामीटर (ओं) के साथ 'toString()' * यह पसंद कर सकता है। जेडीके से बहुत सारे उदाहरण हैं जो इस पैटर्न का उपयोग करते हैं, उदाहरण के लिए ['Integer.toString (int)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer। एचटीएमएल # toString (int))। – Bohemian

4

यदि आपको अधिक पैरामीटर पारित करने की आवश्यकता है तो आप toString() ओवरराइड नहीं कर सकते हैं (toString() कोई प्राप्त नहीं करता है)। सीधे शब्दों में enum में एक नई विधि को परिभाषित, ओवरराइड करने के लिए कोई जरूरत नहीं:

public String getAsFormattedText(Object... o) { 
    return String.format(text, o); 
} 

आप इस पद्धति toString() का नाम नहीं होना चाहिए, यह भ्रामक है क्योंकि आप वर्तमान वस्तु की स्ट्रिंग प्रतिनिधित्व नहीं लौटा रही हैं होगा, बजाय आप पैरामीटर के रूप में पारित वस्तुओं की एक स्वरूपित स्ट्रिंग वापस कर रहे हैं। इसके अलावा, text() विधि को getText() कहा जाना चाहिए, यह जावा सम्मेलन है।

बेहतर नाम का उपयोग करें जो स्पष्ट रूप से इंगित करता है कि लौटाई गई स्ट्रिंग कोई स्ट्रिंग नहीं है - यह एक स्वरूपित स्ट्रिंग है जो पाठ को पैरामीटर के रूप में स्वरूपित करने की अपेक्षा करता है - स्पष्ट रूप से इसे व्यक्त करता है।

+0

हाँ बहुत भ्रमित है जब कोई किसी भी पैरा को पास नहीं करना चाहता है लेकिन पैरामीटर रहित स्ट्रिंग को प्राप्त करता है। –