2011-01-20 16 views
7

मैंने कुछ सेटिंग्स के अनुकूलन के लिए गुण फ़ाइल लेना चुना। मैं एक वर्गजावा गुणों को कक्षाओं में उपलब्ध कराएं?

Properties defaultProps = new Properties(); 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

मैं हर वर्ग में जोड़ने के लिए है में वस्तु एक गुण बनाने के लिए निम्नलिखित कोड का उपयोग उपलब्ध है? शायद इसलिए नहीं क्योंकि प्रत्येक वर्ग इस फ़ाइल में एक स्ट्रीम खोल देगा। लेकिन मुझे यकीन नहीं है कि इसे ठीक से कैसे संभालें। क्या मुझे कक्षा MyProperties बनाना चाहिए और इसे किसी भी वर्ग में गुणों की आवश्यकता है?

अग्रिम धन्यवाद!

+0

संबंधित जवाब: http: //stackoverflow.com/questions/4362911/how-to-create-a-singleton-class/4363254#4363254 – BalusC

उत्तर

10

एक बार जब आप defaultProps शुरू कर देते हैं, तो आप इसकी सामग्री को अपने ऐप में अन्य ऑब्जेक्ट्स के लिए उपलब्ध कर सकते हैं। एक सार्वजनिक स्थैतिक एक्सेसर विधि के माध्यम से, जैसे:

public class Config { 
    private static Properties defaultProps = new Properties(); 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
    public static String getProperty(String key) { 
    return defaultProps.getProperty(key); 
    } 
} 

यह सबसे सरल तरीका है, लेकिन यह एक अतिरिक्त निर्भरता जो इकाई का परीक्षण करता है बनाता है कठिन (जब तक आप Config में एक विधि इकाई परीक्षण के लिए एक नकली संपत्ति वस्तु स्थापित करने के लिए प्रदान करते हैं)।

एक विकल्प यह है कि प्रत्येक ऑब्जेक्ट में defaultProps (या उससे व्यक्तिगत कॉन्फ़िगरेशन मान) को इंजेक्ट करना है। हालांकि, इसका मतलब यह हो सकता है कि यदि आपके कॉल पदानुक्रम गहरे हैं तो आपको कई तरीकों से अतिरिक्त पैरामीटर जोड़ना होगा।

+1

मुझे यह समाधान पसंद नहीं है। विधि को गैर स्थैतिक बनाना और सिंगलटन बनाना इसे अधिक लचीला बनाता है और कुछ भी लागत नहीं लेता है। – maaartinus

+0

@ मायार्टिनस: सिंगलटन पैटर्न को और अधिक लचीला कैसे लगा रहा है? क्या आप इसे अमूर्त फैक्ट्री पैटर्न से भ्रमित नहीं कर रहे हैं? – BalusC

+1

@ मायार्टिनस, सिंगलटन इसे और अधिक लचीला कैसे बनायेगा? ध्यान दें कि व्यावहारिक रूप से यह पहले से ही एक सिंगलटन है (यह एक अद्वितीय वैश्विक वस्तु है, इसकी सभी निर्भरता सामान के साथ), बस एक इंटरफ़ेस के पीछे छिपा हुआ है। –

0

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

0

गुणों को लोड करने और गुणों को स्टोर करने के लिए गुणों को लोड करें जो अन्य वर्गों से खींच सकते हैं। यदि वह एक माईप्रोपर्टीज क्लास है जो कहीं भी एक स्थिर चर का संदर्भ देता है जो ठीक है।

0

यह वैश्विक स्तर पर कुछ भी उपलब्ध कराने का एक विशेष मामला है। स्थिर तरीकों का उपयोग करना काफी खराब है। एक बेहतर लेकिन खराब समाधान sigleton पैटर्न का उपयोग कर रहा है। परीक्षण यहां सबसे बड़ी समस्या है। आईएमएचओ, सबसे अच्छा तरीका Dependency injection का उपयोग कर रहा है, हालांकि यह छोटे अनुप्रयोगों के लिए एक ओवरकिल हो सकता है।

3

यदि आपको केवल अपनी प्रॉपर्टी क्लास के एक उदाहरण की आवश्यकता है तो आप singleton pattern का उपयोग कर सकते हैं।

यह इस तरह एक वर्ग ऐसा दिखाई देगा:

public class MyProperties extends Properties { 
    private static MyProperties instance = null; 

    private MyProperties() { 
    } 

    public static MyProperties getInstance() { 
     if (instance == null) { 
      try { 
       instance = new MyProperties(); 
       FileInputStream in = new FileInputStream("custom.properties"); 
       instance.load(in); 
       in.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return instance; 
    } 
} 
+0

"this.load (in);" "example.load (में) होना चाहिए;" – icedek

+0

@icedek तय (मेरा क्या पुराना जवाब है!) – SirDarius

0

के बाद से इस जानकारी को सभी उदाहरणों भर में स्थिर है, मैं एक singleton रूप Properties वर्ग को लागू करने की सलाह देते हैं। staticinitialization block विधि का उपयोग करके, प्रोग्राम शुरू होने पर आप फ़ाइल को स्वचालित रूप से लोड कर सकते हैं।

public class Properties { 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    protected static void load(FileInputStream in) { 
    // existing load functionality here 
    } 
} 

आपको अभी भी एक आंतरिक स्टोरेज तंत्र और एक्सेसर तंत्र की आवश्यकता होगी। इन्हें static चिह्नित किया जाना चाहिए।

1

एक स्थिर संसाधन बंडल का उपयोग क्यों नहीं करें?

static final ResourceBundle myResources = 
      ResourceBundle.getBundle("MyResources", currentLocale); 
0

प्रत्येक वर्ग में गुण लोड करने की बजाय। इसे मुख्य() के आसपास कहीं लोड करें और इसे अपने रचनाकारों के माध्यम से अन्य कक्षाओं में पास करें।

उन्हें वैश्विक स्तर पर साझा न करें। - मुश्किल परीक्षण करने के लिए - अमूर्त के खिलाफ (ग्लोबल का उपयोग, डीएओ उपयोगकर्ता सेटिंग एक्सेस कर सकते इसे पारित यह केवल क्या जरूरत से .. नहीं सब कुछ रोका जाना चाहिए।) - कक्षा झूठ है कि वे क्या जरूरत है

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