2011-02-19 23 views
10

मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?

+1

संभावित डुप्लिकेट [आवेषण और अपवादों पर; जावा] (http://stackoverflow.com/questions/4863694/on-asserts-and-exceptions-java) –

उत्तर

2

दावाों को बंद कर दिया जा सकता है (वास्तव में, वे आम तौर पर होते हैं), इसलिए वे उपयोगकर्ता इनपुट को मान्य करने के लिए उपयोगी नहीं हैं, उदाहरण के लिए।

29

Validate.isTrue और 'assert' पूरी तरह से अलग-अलग उद्देश्यों को पूरा करते हैं।

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

डिज़ाइन-बाय-कॉन्ट्रैक्ट के संदर्भ में, पूर्व-और पोस्टकंडिशन के साथ-साथ क्लास इनवेरिएंट को परिभाषित करने के लिए दावे का उपयोग किया जा सकता है। यदि रन टाइम पर इन्हें पकड़ने का पता नहीं लगाया गया है, तो यह सिस्टम में किसी समस्या या कार्यान्वयन समस्या को इंगित करता है।

Validate.isTrue
org.apache.commons.lang.Validate अलग है। यह जुनीट-जैसी विधियों का एक सरल सेट प्रदान करता है जो एक शर्त की जांच करता है, और यदि स्थिति नहीं है तो "अवैध आर्ग्यूमेंट अपवाद" फेंक दें।

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

एक अवैध आर्ग्यूमेंट एक्सेप्शन फेंकने के बाद, यह 0cको पोस्टकंडिशन या इनवेरिएंट को जांचने के लिए अपाचे के सत्यापन का उपयोग करने के लिए समझ में नहीं आता है। इसी तरह, उपयोगकर्ता इनपुट सत्यापन, के लिए 'जोर' का उपयोग करना गलत है क्योंकि रनर समय पर दावा जांच अक्षम की जा सकती है।

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

public int m(int n) { 
    // the class invariant should hold upon entry; 
    assert this.invariant() : "The invariant should hold."; 

    // a precondition in terms of design-by-contract 
    assert this.isInitialized() : "m can only be invoked after initialization."; 

    // Implement a tolerant contract ensuring reasonable response upon n <= 0: 
    // simply raise an illegal argument exception. 
    Validate.isTrue(n > 0, "n should be positive"); 

    // the actual computation. 
    int result = complexMathUnderTrickyCircumstances(n); 

    // the postcondition. 
    assert result > 0 : "m's result is always greater than 0."; 
    assert this.processingDone() : "processingDone state entered after m."; 
    assert this.invariant() : "Luckily the invariant still holds as well."; 

    return result; 
} 

अधिक जानकारी::

  • बर्ट्रेंड मेयेर, "अनुबंध द्वारा डिजाइन को लागू करने", IEEE कम्प्यूटर, 1992 (pdf)
  • Johsua बलोच उदाहरण के लिए। प्रभावी जावा, दूसरा संस्करण, आइटम 38. वैधता के लिए पैरामीटर जांचें।(google books)
+1

जोशुआ ब्लोच। * प्रभावी जावा *, आइटम 23: वैधता के लिए पैरामीटर जांचें। – artdanil

1

@thilo कीवर्ड पर जोर देने के लिए सही है, लेकिन वसंत Assert जैसे Assertion के बारे में विचार करें।

गुवा से ConditionalFailuresExplained देखें।

  • पूर्वशर्त "आप (फोन करने वाले) में गड़बड़।"
  • दावा "मैंने गड़बड़ की।"
  • सत्यापन "कोई भी मैं गड़बड़ पर निर्भर करता हूं।"
संबंधित मुद्दे