2009-04-08 23 views
6

वहाँ जावा "गुण" का दस्तावेजीकरण फ़ाइल की सामग्री, सहित के लिए एक अच्छी तरह से स्थापित दृष्टिकोण है:सर्वश्रेष्ठ अभ्यास/आवश्यक जावा गुण सामग्री फ़ाइल

  • डेटा प्रकार को निर्दिष्ट/किसी कुंजी के लिए उम्मीद सामग्री
  • निर्दिष्ट करने के लिए एक महत्वपूर्ण
  • कार्य करने के लिए

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

मुझे लगता है कि मैं क्या तलाश कर रहा हूँ गुण फ़ाइलों के लिए एक "getopt" बराबर ...

है [संपादित करें: संबंधित]

+0

ने कोड को शामिल करने के लिए अपना उत्तर अपडेट किया है जो आपको उस पर शुरू करना चाहिए। – TofuBeer

+0

वाह, मुझे बस इसके लिए "लोकप्रिय प्रश्न" बैज मिला, केवल 3 अपवॉट्स के साथ ... विषम ... मैं अभी भी इसके लिए एक संतोषजनक समाधान कर रहा हूं। – andersoj

उत्तर

1

मैंने इसे करने का मानक तरीका कभी नहीं देखा है। क्या मैं शायद करना होगा है:

  • रैप या java.util.Properties वर्ग
  • ओवरराइड (विस्तार के) बढ़ाने या एक तरीका प्रदान (यदि रैपिंग) दुकान विधि (या storeToXML, आदि) कि बाहर के लिए एक टिप्पणी लिखते हैं प्रत्येक पंक्ति।
  • में ऐसी विधि है जो गुणों को संग्रहीत करती है, जिसमें कुछ प्रकार की इनपुट फ़ाइल होती है जहां आप प्रत्येक के गुणों का वर्णन करते हैं।

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

या यह बहुत कम लाभ के लिए बहुत अधिक काम हो सकता है (यही कारण है कि वहां कुछ स्पष्ट नहीं है)।

यदि आप ऐसी टिप्पणियों को निर्दिष्ट कर सकते हैं जिन्हें आप देखना चाहते हैं तो मैं कुछ लिखने पर एक स्टैब ले सकता हूं यदि मैं ऊब जाता हूं :-) (यह ऐसी चीज है जो मुझे मस्ती के लिए करना पसंद है, बीमार मुझे पता है: -)।

ठीक है ... मैं ऊब गया ...

import java.util.Properties; 


public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Properties   properties; 
     final PropertiesVerifier verifier; 

     properties = new Properties(); 
     properties.put("property.one", "true"); 
     properties.put("property.two", "false"); 
//  properties.put("property.three", "5"); 
     verifier = new PropertiesVerifier(
      new PropertiesVerifier.PropertyInfo[] 
      { 
       new PropertiesVerifier.PropertyInfo("property.one", 
                true, 
                Boolean.class), 
       new PropertiesVerifier.PropertyInfo("property.two", 
                false, 
                Boolean.class), 
//    new PropertiesVerifier.PropertyInfo("property.three", 
//             true, 
//             Boolean.class), 
      }); 

     System.out.println(verifier.isKnown("property.one")); 
     System.out.println(verifier.isKnown("property.two")); 
     System.out.println(verifier.isKnown("property.three")); 

     System.out.println(verifier.isRequired("property.one")); 
     System.out.println(verifier.isRequired("property.two")); 
     System.out.println(verifier.isRequired("property.three")); 

     System.out.println(verifier.isOptional("property.one")); 
     System.out.println(verifier.isOptional("property.two")); 
     System.out.println(verifier.isOptional("property.three")); 

     System.out.println(verifier.getType("property.one")); 
     System.out.println(verifier.getType("property.two")); 

     // System.out.println(verifier.getType("property.tthree")); 
     System.out.println(verifier.isValid("property.one", "true")); 
     System.out.println(verifier.isValid("property.two", "false")); 
     // System.out.println(verifier.isValid("property.tthree", "5")); 


     verifier.verifyProperties(properties); 
    } 
} 
+0

@TofuBeer: धन्यवाद ... मैं सक्रिय रूप से हमारे प्रोजेक्ट के लिए इस तरह कुछ के साथ खेल रहा हूं ... जेए – andersoj

+0

ठीक है, मैंने व्यापक शोध किया है और आपके द्वारा पोस्ट किया गया कोड वहां सबसे अच्छी बात है ... धन्यवाद ! --JA – andersoj

1

एक आसान तरीका है नमूना गुण फ़ाइल के साथ अपनी परियोजना को वितरित करने के लिए, उदाहरण के लिए मेरे प्रोजेक्ट में svn में "build.properties.example" है, गुणों के साथ जरूरी टिप्पणी की गई है। स्थानीय रूप से सही गुण svn में नहीं जाते हैं।

चूंकि आप "getopt" का उल्लेख करते हैं, हालांकि, मुझे आश्चर्य है कि क्या आप वास्तव में cmd ​​लाइन तर्कों के बारे में सोच रहे हैं? यदि कोई "मुख्य" है जिसे विशिष्ट गुणों की आवश्यकता होती है, तो मैं आमतौर पर इसे "उपयोग" संदेश में प्रासंगिक निर्देश डालता हूं जो तर्क गलत है या "-h" प्रिंट करता है।

+0

आपका पहला अनुच्छेद उसे वह करने के लिए कहता है जो वह कहता है कि वह पहले से ही कर रहा है। आपका दूसरा अनुच्छेद प्रश्न के लिए अप्रासंगिक है (वह स्पष्ट रूप से कहता है कि वह गुण फ़ाइलों के बारे में बात कर रहा है)। –

+0

अच्छा, असल में ऐसा लगता था कि वह एक डिफ़ॉल्ट फ़ाइल में पढ़ने के बारे में बात कर रहा है, न कि "मृत" उदाहरण। स्पष्टता के लिए सवाल भी थोड़ा सा संपादित किया गया है। –

3

आप Apache Commons Configuration पैकेज में सुविधाओं में से कुछ का उपयोग कर सकते: यहाँ कुछ इसके लिए :-)

import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Properties; 


public class PropertiesVerifier 
{ 
    private final Map<String, PropertyInfo> optionalInfo; 
    private final Map<String, PropertyInfo> requiredInfo; 

    { 
     optionalInfo = new HashMap<String, PropertyInfo>(); 
     requiredInfo = new HashMap<String, PropertyInfo>(); 
    } 

    public PropertiesVerifier(final PropertyInfo[] infos) 
    { 
     for(final PropertyInfo info : infos) 
     { 
      final Map<String, PropertyInfo> infoMap; 

      if(info.isRequired()) 
      { 
       infoMap = requiredInfo; 
      } 
      else 
      { 
       infoMap = optionalInfo; 
      } 

      infoMap.put(info.getName(), info); 
     } 
    } 

    public void verifyProperties(final Properties properties) 
    { 
     for(final Entry<Object, Object> property : properties.entrySet())  
     { 
      final String key; 
      final String value; 

      key = (String)property.getKey(); 
      value = (String)property.getValue(); 

      if(!(isValid(key, value))) 
      { 
       throw new IllegalArgumentException(value + " is not valid for: " + key); 
      } 
     } 
    } 

    public boolean isRequired(final String key) 
    { 
     return (requiredInfo.get(key) != null); 
    } 

    public boolean isOptional(final String key) 
    { 
     return (optionalInfo.get(key) != null); 
    } 

    public boolean isKnown(final String key) 
    { 
     return (isRequired(key) || isOptional(key)); 
    } 

    public Class getType(final String key) 
    { 
     final PropertyInfo info; 

     info = getPropertyInfoFor(key); 

     return (info.getType()); 
    } 

    public boolean isValid(final String key, 
          final String value) 
    { 
     final PropertyInfo info; 

     info = getPropertyInfoFor(key); 

     return (info.verify(value)); 
    } 

    private PropertyInfo getPropertyInfoFor(final String key) 
    { 
     PropertyInfo info; 

     info = requiredInfo.get(key); 

     if(info == null) 
     { 
      info = optionalInfo.get(key); 

      if(info == null) 
      { 
       // should be a better exception maybe... depends on how you 
       // want to deal with it 
       throw new IllegalArgumentException(key + " 
                is not a valid property name"); 
      } 
     } 

     return (info); 
    } 

    protected final static class PropertyInfo 
    { 
     private final String name; 
     private final boolean required; 
     private final Class clazz; 
     private final Verifier verifier; 

     protected PropertyInfo(final String nm, 
           final boolean mandatory, 
           final Class c) 
     { 
      this(nm, mandatory, c, getDefaultVerifier(c)); 
     } 

     protected PropertyInfo(final String nm, 
           final boolean mandatory, 
           final Class c, 
           final Verifier v) 
     { 
      // check for null 
      name  = nm; 
      required = mandatory; 
      clazz = c; 
      verifier = v; 
     } 

     @Override 
     public int hashCode() 
     { 
      return (getName().hashCode()); 
     } 

     @Override 
     public boolean equals(final Object o) 
     { 
      final boolean retVal; 

      if(o instanceof PropertyInfo) 
      { 
       final PropertyInfo other; 

       other = (PropertyInfo)o; 
       retVal = getName().equals(other.getName()); 
      } 
      else 
      { 
       retVal = false; 
      } 

      return (retVal); 
     } 

     public boolean verify(final String value) 
     { 
      return (verifier.verify(value)); 
     } 

     public String getName() 
     { 
      return (name); 
     } 

     public boolean isRequired() 
     { 
      return (required); 
     } 

     public Class getType() 
     { 
      return (clazz); 
     } 
    } 

    private static Verifier getDefaultVerifier(final Class clazz) 
    { 
     final Verifier verifier; 

     if(clazz.equals(Boolean.class)) 
     { 
      // shoudl use a singleton to save space... 
      verifier = new BooleanVerifier(); 
     } 
     else 
     { 
      throw new IllegalArgumentException("Unknown property type: " + 
               clazz.getCanonicalName()); 
     } 

     return (verifier); 
    } 

    public static interface Verifier 
    { 
     boolean verify(final String value); 
    } 

    public static class BooleanVerifier 
     implements Verifier 
    { 
     public boolean verify(final String value) 
     { 
      final boolean retVal; 

      if(value.equalsIgnoreCase("true") || 
       value.equalsIgnoreCase("false")) 
      { 
       retVal = true; 
      } 
      else 
      { 
       retVal = false; 
      } 

      return (retVal); 
     } 
    } 
} 

एक शुरुआत और एक साधारण परीक्षण कम से कम है। यह कम से कम आपके गुणों के लिए प्रकार का उपयोग प्रदान करता है।

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

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

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

#list of required properties 
required=prop1,prop2,prop3 

#all properties and their types 
prop1.type=Integer 
prop2.type=String 

मैंने अपाचे कॉन्फ़िगरेशन पैकेज के सभी को नहीं देखा है, लेकिन उनके पास अक्सर इस तरह की उपयोगी उपयोगिताएं होती हैं। मुझे आश्चर्य नहीं होगा अगर आपको वहां कुछ मिल सकता है जो इसे सरल बना देगा।

2

चेक आउट करने का एक अन्य विकल्प OWNER नामक प्रोजेक्ट है। वहां, आप इंटरफ़ेस को परिभाषित करते हैं जो आपके एप्लिकेशन में कॉन्फ़िगरेशन ऑब्जेक्ट के रूप में कार्य करता है, प्रकार और एनोटेशन का उपयोग करता है। फिर, स्वामी Properties फ़ाइल की खोज और पार्सिंग करता है। इस प्रकार, आप अपने इंटरफ़ेस के लिए javadoc लिख सकते हैं और दस्तावेज़ के रूप में उपयोग कर सकते हैं।

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