2009-10-16 10 views
8

क्या दृढ़ता से टाइप की गई कक्षाओं के रूप में गुण फ़ाइलों को प्राप्त करने का कोई तरीका है? मुझे लगता है कि कोड जेनरेटर हैं लेकिन एनोटेशन के साथ ऐसा करना बहुत कूलर होगा।जावा। प्रोपर्टीज फाइलें दृढ़ता से टाइप की गई कक्षाओं के रूप में

मेरा मतलब क्या है;

foo.properties file 
keyFoo = valuefoo 
keyBar = valuebar 

@properties(file="foo.properties") 
class foo { } 

साथ

शायद

class foo { 
    String getKeyFoo() { } 
    String getKeyBar() { } 
} 

हो जाता है नहीं तो मुझे लगता है कि के लिए एक ओपन सोर्स प्रोजेक्ट शुरू करेगा?

प्रश्न के लिए अतिरिक्त;

सोचें कि हमारे पास foo.properties फ़ाइल है जिसमें 10 से अधिक प्रविष्टियां हैं; और लगता है कि यह एक साधारण विन्यास फाइल के रूप में प्रयोग किया जाता है। मेरा मानना ​​है कि इस कॉन्फ़िगरेशन प्रविष्टियों को डिज़ाइन के अन्य भागों में संबंधित getXXX विधियों के साथ कॉन्फ़िगरेशन क्लास के रूप में प्रदान किया जाना चाहिए। फिर शेष सिस्टम प्रमुख नामों से निपटने के बजाय प्रदत्त वर्ग के माध्यम से कॉन्फ़िगरेशन तक पहुंचता है और कॉन्फ़िगरेशन कहां परेशान करने की आवश्यकता नहीं होती है। फिर जब आप कॉलर्स का परीक्षण कर रहे हों और फ़ाइल सिस्टम पर निर्भरता दूर हो तो आप इस वर्ग को नकली के साथ प्रतिस्थापित कर सकते हैं। दूसरी तरफ को वास्तव में अच्छा लगा है दृढ़ता से टाइप की गई फैशन में सभी प्रविष्टियां प्राप्त करें।

तो यह समस्या दृश्यों के पीछे एक कोड जनरेशन मुद्दा है, यह रनटाइम से संबंधित कुछ भी नहीं है। लेकिन एनोटेशन के बजाए बाहरी चीज़ के साथ कोड पीढ़ी मेरे लिए अच्छा नहीं लग रहा था। हालांकि मैं एनोटेशन से बहुत परिचित नहीं हूं, मुझे लगता है कि यह हासिल किया जा सकता है (लेकिन मुझे यह ध्यान में रखेगा कि एनोटेशन मैकडॉवेल पॉइंट्स के रूप में कक्षाएं उत्पन्न नहीं कर सकता)

+1

क्या इस के लिए उपयोग के मामले हो सकते हैं? एक उदाहरण बहुत अच्छा होगा – Chii

उत्तर

2

स्थिरता टाइप की गई फ़ाइलों के रूप में कॉन्फ़िगरेशन करने के लिए somewhat similar project है। यह एक अंतरफलक की घोषणा करने की आवश्यकता है, लेकिन यह कार्यान्वयन में ही भर देता है:

public interface AppConfig extends Config { 
    long getTimeout(); 
    URL getURL(); 
    Class getHandlerClass(); 
} 
+0

लिंक मर चुका है ... – Kukeltje

+0

ओवेनर फ्रेमवर्क इस कॉन्फ़िगरेशन को प्रदान करता है, http://owner.aeonbits.org/ – vorburger

0

यदि आप इसे स्थिर रूप से करना चाहते हैं, तो यह कोड कोड समस्या जिसे आसानी से हल किया जा सकता है (फ़ाइल में प्रत्येक आइटम के लिए, एक नया getXXX विधि उत्पन्न करें)।

लेकिन यदि आप इसे रनटाइम पर चाहते हैं, तो आपको अपनी कोड संदर्भ विधि रखने की समस्या है जो संकलन समय पर मौजूद नहीं है; मुझे नहीं लगता कि यह किया जा सकता है।

(ध्यान दें कि आप देख रहे हैं एक परियोजना idead, रिवर्स, एक्सेसर विधि और एनोटेशन, और एक कार्यान्वयन क्रम में उत्पन्न के साथ एक अंतरफलक करना, उस टिप्पणी किए गए तरीकों पर निर्भर करता है के लिए, किया जा सकता है।)

+0

हां, यह किया जा सकता है - जावा एक बेहद गतिशील भाषा है, और आप इच्छानुसार कक्षाओं को थूक सकते हैं और संशोधित कर सकते हैं। सवाल यह है कि "कितना प्रयास आवश्यक है?" –

+0

बेशक, किसी ऑब्जेक्ट को conf फ़ाइल से उत्पन्न करना हमेशा संभव होता है, लेकिन पहले से ही तरीकों को जानने के बिना, आप प्रतिबिंब या इस तरह की चीजों का उपयोग किए बिना इसका उपयोग नहीं कर पाएंगे, और इससे यह बहुत कम दिलचस्प बनाता है । – penpen

+0

@ जोनाथन: आईएमओ, वास्तविक सवाल यह है कि "बिंदु क्या है?" चूंकि @penpen बताते हैं कि आप केवल प्रतिबिंब (या अन्य जेनरेट कोड से) का उपयोग करके उपन्यास getXXX विधियों को कॉल कर सकते हैं। –

1

एनोटेशन प्रसंस्करण उपकरण (apt) कक्षाओं संशोधित नहीं कर सकते (हालांकि यह नए लोगों को बना सकते हैं)। संकलन समय पर कक्षा को संशोधित करने के लिए, आपको शायद एएसटी को संपादित करने की आवश्यकता होगी (Project Lombok करता है)। संभवतः कक्षाएं उत्पन्न करने के लिए सबसे सरल दृष्टिकोण होगा और फिर उत्पन्न कोड को अन्य कोड के लिए निर्भरता के रूप में उपयोग करें।

3

अनगिनत ढांचे हैं जो विभिन्न डिग्री कॉन्फ़िगरेशन के साथ एक्सएमएल के लिए प्राप्त करते हैं। जावा के साथ बंडल वाला मानक एक जैक्सबी है लेकिन यह वास्तव में एक लाइनर एक्सएमएल दृढ़ता फ्रेमवर्क नहीं है ...

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

इसका मतलब है कि परियोजना का दायरा सीमित होगा। प्रोजेक्ट के लिए अधिकतर उपयोगी गुणों के लोड होने के लिए अधिक उपयोगी।

बड़े आवेदन में मैंने काम किया है, गुण फ़ाइल की दृढ़ता से टाइपिंग अक्सर एक साधारण फैक्ट्री-विधि का उपयोग करके किया जाता है।

Foo foo = Foo.loadFrom("foo.properties"); 

class Foo { 
    static Foo loadFrom(String fileName) { 
     Properties props = new Properties(); 
     props.load(...); 

     Foo foo = new Foo(); 
     foo.setKeyFoo(props.get("KeyFoo")); 
     ... 
     return foo; 
    } 
    ... 
} 
+0

देखें या ऑब्जेक्ट को गतिशील रूप से लोड करने के लिए रनटाइम पर प्रतिबिंब का उपयोग करें: आप एनोटेशन (क्लास, विधि और फ़ील्ड ऑब्जेक्ट्स) और गुणों को गतिशील रूप से प्राप्त/सेट करें (अपाचे सामान्य-सेम का उपयोग करके आप वहां मदद कर सकते हैं)। इसे सरल रखने की कोशिश करें हालांकि आपके पास छोटी कॉन्फ़िगरेशन है। कॉन्फ़िगरेशन के लोड के लिए, एक्सएमएल आपको संरचना, सत्यापन और दस्तावेज़ीकरण (एक्सएसडी में) लाता है, ... – vdr

+0

जेएक्सबी के लिए +1। मैंने अपनी विन्यास के लिए इसे स्विच कर दिया है। मुझे अपनी कॉन्फ़िगरेशन/राज्य भेद को साफ करने के लिए भी मजबूर किया। –

1

JFig (बदसूरत IMO), Commons Configuration या EasyConf तरह?

+0

ओटी: दिलचस्प: हालांकि गुणों को पढ़ने के लिए कई पुस्तकालय हैं, उनमें से कोई भी आदेशित पुनरावृत्ति प्रदान नहीं करता है - इसलिए मुझे फ़ाइल में परिभाषित क्रम में गुण नहीं मिल सकते हैं। इसलिए मैंने गुणों को बढ़ाया और सभी मानचित्र विधियों को ListOrderedMap पर सौंप दिया। –

+0

जेएफआईजी के लिए नया विकल्प: https://github.com/sofdes/config-generation-maven-plugin – user1016765

0

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

वैचारिक समस्या यह है कि एक संपत्ति फ़ाइल मौलिक रूप से एक स्थाई रूप से टाइप की गई इकाई नहीं है। प्रत्येक बार जब कोई संपत्ति फ़ाइल संपादित करता है तो वे नई गुण जोड़ सकते हैं, और इसलिए संपत्ति फ़ाइल के "प्रकार" को बदल सकते हैं ... और निहितार्थ से, संबंधित API का हस्ताक्षर। यदि हमने जांच की है कि जब जावा ऐप ने प्रॉपर्टी फ़ाइल लोड की है तो कोई अप्रत्याशित गुण नहीं थे, तो हमारे पास एक स्पष्ट डायनामिक टाइप-चेक है। अगर हम अप्रत्याशित (उदा। गलत नाम) गुणों की जांच नहीं करते हैं, तो हमें त्रुटियों का स्रोत मिला है। अगर आप संपत्ति मूल्यों के प्रकार स्ट्रिंग के अलावा कुछ और चाहते हैं तो चीजें भी गड़बड़ हो जाती हैं।

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

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

+0

मुझे यह नहीं मिला कि आप वास्तव में क्या मतलब रखते हैं "और इसलिए फ़ाइल के" प्रकार "को बदलें" ... लेकिन मुझे लगता है कि आप क्या चिंता कर रहे हैं फ़ाइल में अलग-अलग डेटा प्रकार हैं? यदि ऐसा है तो; इस मामले के लिए रिटर्न प्रकार हमेशा स्ट्रिंग होते हैं ... इसलिए फ़ाइल में एक नई प्रविष्टि जोड़ने से जनरेटर एक नई एक्सेसर विधि उत्पन्न कर सकता है ... – erdogany

+0

@erdogany: नहीं। मैं गुणों के नाम बदलने के बारे में बात कर रहा हूं। यदि आप प्रश्न पढ़ते हैं, तो आप देखेंगे कि ओपी प्रत्येक प्रॉपर्टी को एक अलग गेटटर विधि पर मैप करना चाहता है जिसका नाम संपत्ति के नाम से लिया गया है। –

1

फिर भी एक और तरीका डेटा बाध्यकारी ढांचे का उपयोग करना है जो ऐसा करता है। यहां तक ​​कि कोई भी जो सीधे समर्थन नहीं करता है, वह काम कर सकता है: उदाहरण के लिए, Jackson JSON प्रोसेसर इसे कुछ ऐसा करने की अनुमति देगा:

ऑब्जेक्टमैपर एम = नया ऑब्जेक्टमैपर(); माईबीन बीन = एम। कन्वर्टवैल्यू (गुण, MyBean.class); // (ध्यान दें: ट्रंक से नवीनतम कोड की आवश्यकता है, अन्यथा वापस पढ़ें पहले लिखने की ज़रूरत)

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

0

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

http://sourceforge.net/projects/jhpropertiestyp/

पर एक नज़र डालें यह है खुले sourced और पूरी तरह से

प्रलेखित यहाँ SourceForge से मेरी संक्षिप्त विवरण है:

JHPropertiesTyped will give the developer strongly typed properties. Easy to integrate in existing projects. Handled by a large series for property types. Gives the ability to one-line initialize properties via property IO implementations. Gives the developer the ability to create own property types and property io's. Web demo is also available, screenshots shown above. Also have a standard implementation for a web front end to manage properties, if you choose to use it. 

Complete documentation, tutorial, javadoc, faq etc is a available on the project webpage. 
संबंधित मुद्दे