2008-09-26 22 views
25

में मैं एक विधि है का कहना है कि कर सकते हैं:जावा: Enum पैरामीटर विधि

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { } 

और जैसा कि आप देख सकते हैं, मैं एक पैरामीटर संरेखित कहा जाता है। इस विधि के अंदर मुझे कुछ होने की स्थिति है यदि मूल्य 'बाएं' या 'दाएं' है। पैरामीटर को स्ट्रिंग के रूप में सेट करना, जाहिर है कि मैं किसी भी स्ट्रिंग मान को पास कर सकता हूं .. मैं जानना चाहता हूं कि यह संभव है या नहीं विधि पैरामीटर के रूप में एनम मान रखने के लिए, और यदि हां, तो कैसे?

बस अगर कोई इस बारे में सोचता है; मैंने एक बूलियन मूल्य का उपयोग करने के बारे में सोचा लेकिन मुझे वास्तव में यह पसंद नहीं है। सबसे पहले, सही/गलत को बाएं/दाएं से कैसे जोड़ना है? (ठीक है, मैं टिप्पणियों का उपयोग कर सकता हूं लेकिन मुझे अभी भी यह गंदा लगता है) और दूसरी बात, मैं एक नया मान जोड़ने का फैसला कर सकता हूं, जैसे कि 'औचित्य', इसलिए यदि मेरे पास 2 से अधिक संभावित मान हैं, तो बूलियन प्रकार का उपयोग करना संभव नहीं है।

कोई विचार?

+4

+1 बुलियन और टिप्पणियों का उपयोग नहीं करना चाहते हैं - धन्यवाद, अच्छा महोदय। – wchargin

उत्तर

56

यह करना चाहिए:

private enum Alignment { LEFT, RIGHT };  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    if (align == Alignment.LEFT) 
    { 
    //Process it... 
    } 
} 
1

ज़रूर, तुम एक enum इस्तेमाल कर सकते हैं। क्या कुछ काम करना पसंद करेंगे?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

निजी स्थिर स्ट्रिंग drawCellValue (पूर्णांक maxCellLength, स्ट्रिंग cellValue, संरेखण संरेखण) {}

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

1

आप स्विंगकॉन्स्टेंट का भी पुन: उपयोग कर सकते हैं। {बाएं, दाएं}। वे enums नहीं हैं, लेकिन वे पहले से मौजूद हैं और कई स्थानों पर उपयोग किया जाता है।

19

enums आप स्विच का उपयोग कर सकते के साथ भी कूलर:

switch (align) { 
    case LEFT: { 
     // do stuff 
     break; 
    } 
    case RIGHT: { 
     // do stuff 
     break; 
    } 
    default: { //added TOP_RIGHT but forgot about it? 
     throw new IllegalArgumentException("Can't yet handle " + align); 

    } 
} 

Enums शांत कर रहे हैं क्योंकि अपवाद के उत्पादन में कुछ मनमाने ढंग से पूर्णांक मूल्य enum मान का नाम है, बजाय हो जाएगा।

4

मुझे यह बहुत अच्छा लगता है। if/switch को कम करता है, बस करें।

private enum Alignment { LEFT, RIGHT; 

void process() { 
//Process it... 
} 
};  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    align.process(); 
} 
निश्चित रूप से

, यह हो सकता है:

String process(...) { 
//Process it... 
} 
+4

+1 विचार सही रास्ते पर है। हालांकि, प्रक्रिया विधि अमूर्त होना चाहिए, और बाएं और दाएं प्रत्येक को इसके कार्यान्वयन प्रदान करना चाहिए। –

+1

@ क्रिसजेस्टर-यंग यह उनकी समानता पर निर्भर करता है। यदि वे काफी समान हैं, तो संभव मूल्य केवल एक निजी विधि प्रदान कर सकते हैं जो कार्यान्वयन का एक हिस्सा करता है, और 'प्रक्रिया()' मुख्य कार्य करता है और यदि आवश्यक हो तो कॉल करता है। – glglgl

+0

@glglgl दाएं, यह भी काम करता है। मैं सिर्फ 'if (this == LEFT)' जैसे कोड नहीं देखना चाहता हूं, यह सब कुछ है। :-) –

1

मैं भी यकीन है कि मैं जाकर एक पूर्ण विकसित वर्ग के रूप में एक enum का प्रयोग करेंगे नहीं कर रहा हूँ - यह एक वस्तु उन्मुख भाषा है, और में से एक ऑब्जेक्ट ओरिएंटेशन के सबसे बुनियादी सिद्धांत यह है कि एक वर्ग को एक चीज करना चाहिए और इसे अच्छी तरह से करना चाहिए।

एक enum एक enum होने पर एक बहुत अच्छा काम कर रहा है, और एक वर्ग कक्षा के रूप में एक अच्छा काम कर रहा है। दोनों को मिलाकर मुझे लगता है कि आपको परेशानी होगी - उदाहरण के लिए, आप एक विधि के पैरामीटर के रूप में एक enum का उदाहरण नहीं पारित कर सकते हैं, मुख्य रूप से क्योंकि आप एक enum का उदाहरण नहीं बना सकते हैं।

तो, भले ही आप enum.process() में सक्षम हो सकें, इसका मतलब यह नहीं है कि आपको चाहिए।

1

तुम एक enum में उपयोग कर सकते हैं ने कहा कि इस तरह पैरामीटर:

public enum Alignment { LEFT, RIGHT } 
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {} 

तो आप या तो एक स्विच या अगर बयान वास्तव में साथ कुछ करने के लिए पैरामीटर कहा उपयोग कर सकते हैं।

switch(align) { 
case LEFT: //something 
case RIGHT: //something 
default: //something 
} 

if(align == Alignment.RIGHT) { /*code*/} 
संबंधित मुद्दे