2012-03-14 4 views
9

, मैं इस तरह से स्थिरांक स्टोर करता हूं (मैं जानना चाहता हूं कि आप इस अभ्यास के बारे में क्या सोचते हैं)। यह सिर्फ एक डमी उदाहरण है।जावा में, इंटरफ़ेस के स्थिरांक पर पुनरावृत्ति कैसे करें? एक इंटरफ़ेस में

interface HttpConstants { 
    /** 2XX: generally "OK" */ 
    public static final int HTTP_OK = 200; 
    public static final int HTTP_CREATED = 201; 
    public static final int HTTP_ACCEPTED = 202; 
    public static final int HTTP_NOT_AUTHORITATIVE = 203; 
    public static final int HTTP_NO_CONTENT = 204; 
    public static final int HTTP_RESET = 205; 
    public static final int HTTP_PARTIAL = 206; 

     ... 
} 

क्या इस तरह के इंटरफ़ेस में घोषित सभी स्थिरांकों पर मैं पुन: प्रयास कर सकता हूं?

+0

राय: enums _do_ आधुनिक कोड में बहुत से लाभ प्रदान करते हैं, अत्यधिक अनुशंसित। लेकिन सभी मामलों में नहीं। स्ट्रिंग्स को "पहचानकर्ता" के लिए बहुत एनालॉग का उपयोग किया जाता है (उदा। विशेषता नाम, गुण कुंजी, जेएसएफ व्यू आईडी, जेपीए नाम क्वेरी नाम और क्वेरी प्लेसहोल्डर्स, सुरक्षा भूमिकाएं ...)। समस्या: स्ट्रिंग अक्षर _very_ गलत टाइप करने के लिए आसान हैं, और कोई संकलन समय जांच नहीं है। मैं आमतौर पर एक enum में, इस तरह के तारों को स्थिरांक के रूप में घोषित करना पसंद करते हैं। हालांकि, ** एनोटेशन पैरामीटर ** के रूप में उनका उपयोग करते समय, enums की अनुमति नहीं है और अभी भी एक को अपने कोड के समान 'सार्वजनिक स्थैतिक अंतिम स्ट्रिंग' पर वापस आना होगा। – fr13d

उत्तर

18

का उपयोग प्रतिबिंब:

Field[] interfaceFields=HttpConstants.class.getFields(); 
for(Field f:interfaceFields) { 
    //do something 
} 

लेकिन वैसे भी, अगर आप अपने वर्ग नया स्वरूप कर सकते हैं, मैं तुम्हें एक स्थिर enum स्थिरांक निर्माण संभाल करने की सिफारिश करेंगे।

enum HttpConstants { 

    HTTP_OK(200), HTTP_CREATED(201), HTTP_ACCEPTED(202), 
    HTTP_NOT_AUTHORITATIVE(203),HTTP_NO_CONTENT(204), 
    HTTP_RESET(205), HTTP_PARTIAL(206) /* ... */; 

    private int value; 

    HttpConstants(int aValue) { 
     value=aValue; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

फिर, पाश के लिए उस पर:: इस प्रकार

for(HttpConstants val: HttpConstants.values()) { 
     int value=val.getValue(); 
      //... 
    } 

, प्रतिबिंब API तक पहुंच को परहेज तो, अपने वर्ग suposing हमेशा हर निरंतर के लिए एक पूर्णांक मूल्य शामिल होंगे।

2

आमतौर पर जब मेरे पास ऐसा कुछ होता है तो मैं इंटरफ़ेस में एक नक्शा बना देता हूं जिसमें कुंजी होती है - निरंतर नाम निरंतर मानों के साथ - मान।

और इस तरह मैं उन पर पुन: प्रयास कर सकता हूं।

4
for(Field f : HttpConstants.class.getFields()){ 
     int constant = f.getInt(null); 
} 
+2

btw उन स्थिरांक java.net में परिभाषित हैं। HttpURLConnection –

6

मैं इन स्थिरांक को एक गणना के रूप में बनाउंगा। जावा में एनम्स के अपने क्षेत्र और विधियां हो सकती हैं, जो आपके मामले के लिए बहुत सुविधाजनक हैं। तुम सिर्फ जोड़ने के लिए

for (HttpConstant constant : HttpConstant.values()) { 
    //Do something with the constant 
} 

इस तरह यह भी स्थिरांक के साथ कुछ नए मूल्यों सहयोगी जोड़ना आसान है, अब यात्रा आसान है

enum HttpConstant { 
    HTTP_OK(200), 
    HTTP_CREATED(201), 
    HTTP_ACCEPTED(202), 
    HTTP_NOT_AUTHORITATIVE(203), 
    HTTP_NO_CONTENT(204), 
    HTTP_RESET(205), 
    HTTP_PARTIAL(206); 

    private final int id; 

    HttpConstant(int id) { 
     this.id = id; 
    } 

    int getId() { 
     return id; 
    } 
} 

: तो मैं इस निम्नलिखित तरीके से करना होगा नए क्षेत्र

Field[] interfaceFields = HttpConstants.class.getFields(); 
for (Field field : interfaceFields) { 
    int constant = field.getInt(null); 
    //Do something with the field 
} 

हालांकि, यह क्योंकि प्रतिबिंब कोडिंग त्रुटियों के साथ enums के साथ दृष्टिकोण का उपयोग करने संकलन समय त्रुटियों के बजाय क्रम अपवाद में परिणाम बेहतर है:

अभी आप प्रतिबिंब का उपयोग कर सकते हैं।

3
public enum HttpConstant { 
    /** 2XX: generally "OK" */ 
    HTTP_OK(200). 
    HTTP_CREATED(201), 
    HTTP_ACCEPTED(202), 
    HTTP_NOT_AUTHORITATIVE(203), 
    HTTP_NO_CONTENT(204), 
    HTTP_RESET(205), 
    HTTP_PARTIAL(206); 

    private int code; 
    private HttpConstant(int code) { 
     this.code = code; 
    } 

    public int getCode() { 
     return code; 
    } 
} 

HttpConstant.values() के साथ।

1

मैं चाहूँगा पता है कि आप स्थिरांक के साथ एक अंतरफलक के बजाय एक enum का उपयोग कर इस अभ्यास

पर विचार के बारे में सोच।

enum HttpResultCode { 
    HTTP_OK(200), 
    HTTP_CREATED(201), 
    HTTP_ACCEPTED(202), 
    HTTP_NOT_AUTHORITATIVE(203), 
    HTTP_NO_CONTENT(204), 
    HTTP_RESET(205), 
    HTTP_PARTIAL(206); 

    private final int code; 

    private HttpResultCode(int code) { 
     this.code = code; 
    } 

    public int getCode(int code) { 
     return code; 
    } 

    public static HttpResultCode forCode(int code) { 
     for (HttpResultCode e : HttpResultCode.values()) { 
      if (e.code == code) { 
       return e; 
      } 
     } 

     throw new IllegalArgumentException("Invalid code: " + code); 
    } 
} 
संबंधित मुद्दे