2013-08-29 14 views
5

हमारे पास गुण फ़ाइल में कुछ डेटा है। यह डेटा कई वर्गों में उपयोग किया जाता है। इसलिए, हम प्रत्येक वर्ग में एक गुण श्रेणी वस्तु बनाते हैं और फिर getProperty() विधि का उपयोग कर डेटा पढ़ते हैं। यह कोड के दोहराव की ओर अग्रसर है।संपत्ति फ़ाइल को कई बार पढ़ने से कैसे बचें

क्या कोई इससे बचने के लिए कुछ सर्वोत्तम अभ्यास सुझा सकता है?

एक बात यह है कि मेरे दिमाग में आया है:
एक वर्ग
इस वर्ग में संपत्ति फ़ाइल में प्रत्येक संपत्ति के लिए एक सार्वजनिक चर है बनाएं
एक विधि है कि प्रत्येक और हर संपत्ति
को मान प्रदान करती है में है कक्षा जहां संपत्ति मूल्यों की आवश्यकता है, इस वर्ग के लिए एक वस्तु बनाएं और सार्वजनिक चरों तक पहुंचें

लेकिन, जिन चीज़ों को मैं इस दृष्टिकोण से पसंद नहीं करता वे सार्वजनिक चर हैं और यदि सभी नई संपत्ति संपत्ति फ़ाइल में जोड़ दी जाती है, मुझे कक्षा में उस संपत्ति को पढ़ने के लिए कोड जोड़ने की जरूरत है।

किसी भी मदद की सराहना की जाती है।

धन्यवाद!

+1

कैसे 'बारे में Singleton' दृष्टिकोण के –

+0

के संभावित डुप्लिकेट [जावा गुण वर्गों में उपलब्ध कराएं?] (Http://stackoverflow.com/questions/4750131/मेक-जावा-गुण-उपलब्ध-कक्षाएं) –

उत्तर

0

बॉक्स विकल्प में से एक system properties का उपयोग करना है। आप अपने निष्पादन वातावरण में अपनी खुद की सिस्टम गुण जोड़ सकते हैं।

0

आप इसे स्थिर गुण वस्तु वाले समर्पित वर्ग के साथ कर सकते हैं। उदाहरण के लिए here देखें।

0

मैं अपने डेटा गलत समझ जा सकता है यहाँ प्रवाह, लेकिन यह मेरे लिए "सामान्य" लगता है:

  • एक readPropFile विधि बनाएँ।
    • यह फ़ाइल को पढ़ना चाहिए और उचित गुणों को पार्स करना चाहिए।
    • इन गुणों को Map<String, Object> में संग्रहीत किया जा सकता है, जो संपत्ति के नाम से धोया जाता है।
  • पढ़ें संपत्ति फ़ाइल एक बार (संभवतः जब आवेदन शुरू होता है, या गुण लोड करने के लिए जब भी यह उचित है) ->Properties वस्तु (जैसे कि, props)।
  • props पास उन चीज़ों के आस-पास जो कुछ भी उन गुणों तक पहुंच की आवश्यकता है।
    • या यदि आप इसे स्पष्ट रूप से पास नहीं करना चाहते हैं, तो here के रूप में एक स्थिर एक्सेसर का उपयोग करें।
  • props.get("PROPERTY_NAME") का उपयोग करके एक्सेस गुण (जो कि आंतरिक Map में उस संपत्ति को देखता है)।
    • यदि आप स्ट्रिंग लुकअप का उपयोग नहीं करना चाहते हैं, तो आप कहीं भी वैध संपत्ति नामों का एक हिस्सा रख सकते हैं, और उस का उपयोग करके स्टोरेज/लुकअप कर सकते हैं, लेकिन फिर जब भी आप एक नई संपत्ति जोड़ते हैं तो आपको उस enum को अपडेट करना होगा फ़ाइल में।
+0

धन्यवाद, यह भी उपयोगी है – Austin

17

आप एक सिंगलटन वर्ग, कि गुण पहली बार यह लागू हो जाता है लोड करता है बना सकते हैं ..और एक सार्वजनिक विधि जो किसी दिए गए प्रॉपर्टी कुंजी के लिए संपत्ति मूल्य पुनर्प्राप्त करती है ..

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

कुछ

तरह
public class PropertyHandler{ 

    private static PropertyHandler instance = null; 

    private Properties props = null; 

    private PropertyHandler(){ 
     // Here you could read the file into props object 
     this.props = ..... 
    } 

    public static synchronized PropertyHandler getInstance(){ 
     if (instance == null) 
      instance = new PropertyHandler(); 
     return instance; 
    } 

    public String getValue(String propKey){ 
     return this.props.getProperty(propKey); 
    } 
} 

तो फिर तुम इस रूप में की जरूरत आह्वान कर सकते हैं किसी भी कोड से .. .. यह पसंद है।

String myValue = PropertyHandler.getInstance().getValue(propKey); 

आशा इस

+1

यदि प्रॉपर्टी हैंडलर का उपयोग एक से अधिक धागे से किया जाएगा, तो getInstance को सिंक्रनाइज़ किया जाना चाहिए। –

+0

आप सही हैं ... तय ... (मैंने इसे फ्लाई पर लिखा था .. मैं भूल गया ...) –

+0

हाँ, इससे मदद मिली। आपका बहुत बहुत धन्यवाद। इसके अलावा, उत्तर देने वाले सभी लोगों के लिए धन्यवाद। – Austin

0

मैं एक Enum का उपयोग कर सफलता मिली है में मदद करता है, और निर्माता नाम() विधि का उपयोग करने में एक ही नाम के एक संपत्ति को पढ़ने के लिए। अपवादों को उचित तरीके से संभालना सुनिश्चित करें या नहीं, पूरी कक्षा लोड होने में विफल रहेगी और आपको एक उपयोगी त्रुटि संदेश नहीं मिलेगा।

इस दृष्टिकोण के लाभ यह है कि प्रत्येक enum मान प्रत्येक संपत्ति के लिए अलग-अलग मैपिंग कोड लिखने के बिना स्वचालित रूप से किसी संपत्ति से मेल खाता है। आपको निश्चित रूप से प्रत्येक संपत्ति के लिए एक मूल्यवान मूल्य की आवश्यकता होती है (यदि आप DRY प्रोप संदर्भ चाहते हैं तो यह अपरिहार्य है), लेकिन आप अनचेक स्ट्रिंग का उपयोग करके प्रति-संपत्ति प्रारंभिक कोड को दोहराते हैं।

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

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

2

मेरे लिए स्थिर आंतरिक कक्षा इसे करने का सबसे अच्छा तरीका है। यह आलसी के साथ ऐसा करेगा, क्योंकि वर्ग लोडिंग सिंक्रनाइज़ होती है इसलिए थ्रेड सुरक्षित, साथ ही कलाकार भी। तो इसके साथ हम तीन चीजें प्राप्त कर रहे हैं:

  1. अच्छा प्रदर्शन क्योंकि आजीविका को सिंक्रनाइज़ करने के साथ पीड़ित होगा, लेकिन यहां हम स्थैतिक आंतरिक वर्ग का उपयोग कर रहे हैं।
  2. थ्रेड सुरक्षा क्योंकि जब आंतरिक वर्ग केवल नक्शा की तुलना में लोड किया जाएगा, तो क्लास लोडिंग थ्रेड सुरक्षित है क्योंकि सभी कुल थ्रेड सुरक्षित हैं।
  3. आंतरिक कक्षा लोड की जाएगी जब हम Singleton.initialize().get(key) पर कॉल करेंगे ताकि नक्शा आलसी हो जाए।

नीचे कोड है ...

public class SingletonFactory 
{ 
    private static class Singleton 
    { 
     private static final Map<String, String> map = new HashMap<String, String>(); 
     static 
     { 
      try 
      { 
       //here we can read properties files 
       map.put("KEY", "VALUE"); 
      } 
      catch(Exception e) 
      { 
       //we can do the exception handling 
       System.out.println(e); 
      } 
     } 
     private static Map<String, String> initialize() 
     { 
      return map; 
     } 
    } 

    public static String getValue(String key) 
    { 
     return Singleton.initialize().get(key); 
    } 
} 
संबंधित मुद्दे