2010-01-05 17 views
50

मैं अपनी कक्षा में एक डिफ़ॉल्ट java.util.Properties ऑब्जेक्ट रखने की कोशिश कर रहा हूं, डिफ़ॉल्ट गुणों को स्वीकार करता है, और डेवलपर को java.util.Properties ऑब्जेक्ट निर्दिष्ट करके उनमें से कुछ को ओवरराइड करने दें, लेकिन मुझे ऐसा करने का कोई अच्छा तरीका नहीं मिला।दो java.util.Properties ऑब्जेक्ट्स को मर्ज कैसे करें?

Properties defaultProperties = new Properties(); 
defaultProperties.put("key1", "value1"); 
defaultProperties.put("key2", "value2"); 

Properties otherProperties = new Properties(); 
otherProperties.put("key2", "value3"); 

Properties finalProperties = new Properties(defaultProperties); 

// 
// I'd expect to have something like: 
// 
// finalProperties.merge(otherProperties); 
// 
+0

किसी ने उत्तर दिया लेकिन जवाब हटा दिया, यह बताते हुए कि सही तरीका 'putAll()' विधि का उपयोग करेगा, जो सही उत्तर है और जो मैं चाहता था उसे प्राप्त किया। मैंने देखा नहीं है कि 'java.util.Properties' 'java.util.Hashtable' बढ़ाता है। – Igor

+0

आपको क्यों लगता है कि मेरा जवाब सही नहीं है? – Jerome

+1

यह तकनीकी रूप से गलत नहीं है, लेकिन मैं जो चाहता था वह दो 'java.util.Properties' फ़ाइल को अपनी सामग्री को पुन: स्थापित किए बिना विलय करना था, और यह वही है जो 'putAll()' विधि करता है। – Igor

उत्तर

111

java.util.Propertiesjava.util.Map इंटरफ़ेस लागू करता है, और इसलिए आप बस इसे इस तरह के रूप इलाज कर सकते हैं, और putAll की तरह उपयोग के तरीकों एक और Map की सामग्री को जोड़ने के लिए।

हालांकि, अगर आप यह एक मानचित्र की तरह व्यवहार, तो आप इस के साथ बहुत सावधान रहना चाहिए:

new Properties(defaultProperties); 

इस बार लोगों को बाहर फैल जाती है, क्योंकि यह एक प्रति निर्माता की तरह दिखता है, लेकिन यह नहीं ' टी। यदि आप उस कन्स्ट्रक्टर का उपयोग करते हैं, और उसके बाद keySet() (Hashtable सुपरक्लास से विरासत में मिलाकर) को कॉल करें, तो आपको MapProperties के विधियों को डिफॉल्ट Properties ऑब्जेक्ट का खाता नहीं लेना चाहिए जिसे आपने कन्स्ट्रक्टर में पास किया था। डिफ़ॉल्ट केवल तभी पहचाने जाते हैं जब आप Properties में परिभाषित विधियों का उपयोग करते हैं, जैसे getProperty और propertyNames, दूसरों के बीच।

तो अगर आप दो गुण वस्तुओं मर्ज करने के लिए की जरूरत है, यह सुरक्षित है यह करने के लिए:

Properties merged = new Properties(); 
merged.putAll(properties1); 
merged.putAll(properties2); 

यह आपको अधिक उम्मीद के मुताबिक परिणाम, बल्कि मनमाने ढंग से "डिफ़ॉल्ट" संपत्ति सेट के रूप में उनमें से एक लेबलिंग से दे देंगे ।

आम तौर पर, मैं एक Map रूप Properties इलाज नहीं जावा के शुरुआती दिनों से (गुण निहित होना चाहिए था एक Hashtable, इसे बढ़ाया नहीं - कि आलसी डिजाइन किया गया था) की सिफारिश करेंगे, क्योंकि वह था (मेरी राय में) एक कार्यान्वयन गलती , लेकिन Properties में परिभाषित एनीमिक इंटरफेस हमें कई विकल्प नहीं देता है।

Properties properties = new Properties(); 
properties.load(getClass().getResourceAsStream("default.properties")); 
properties.load(getClass().getResourceAsStream("custom.properties")); 
+2

ग्रेट देने वाला था, मैं बिल्कुल जो लिखा है उसे लिखने वाला था। तुम मुझे एक बग बचाओ। – Igor

+2

मैप के रूप में गुण देखने का एक अन्य खतरा यह है कि यह "जेनेरिकिफाइड" नहीं है: 'Properties.put (" key ", नया ऑब्जेक्ट()) 'संकलित होगा। – Jerome

+1

यह संकलित होगा, हां, और कुछ मामलों में यह ठीक काम करेगा, जब तक आप इसे 'get() 'का उपयोग करके फिर से प्राप्त करते हैं, और' getProperty()' का उपयोग करके इसे पुनः प्रयास न करें। – skaffman

4

आप लगभग अच्छा कर रहे हैं:

Properties defaultProperties = new Properties(); 
defaultProperties.setProperty("key1", "value1"); 
defaultProperties.setProperty("key2", "value2"); 

Properties finalProperties = new Properties(defaultProperties); 
finalProperties.setProperty("key2", "value3"); 

संपादित करें:setProperty द्वारा put प्रतिस्थापित

इरादा उपयोग निम्नलिखित है।

1

हाँ आप सही हैं बस putAll विधि का आह्वान करें और आप कर चुके हैं।

+0

सीडब्लू विवादों से बचने के लिए भी सोचा था कि यह जवाब था कि मैं – OscarRyz

18

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

Properties merged = new Properties(); 
merged.putAll(properties1); 
merged.putAll(properties2); 

लाइन 2 का कोई प्रभाव नहीं पड़ता है। पहली फ़ाइल से गुणों में से कोई भी मर्ज किए गए गुण ऑब्जेक्ट में नहीं होगा।

1

putAll():

+1

** आपकी आखिरी पंक्ति पूरी तरह से असत्य ** है। गुण 1 में मौजूद सभी गुण जो गुण 2 में मौजूद नहीं हैं, विलय में गुण 1 में मान पर सेट करेंगे। –

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