मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?
उत्तर
दावाों को बंद कर दिया जा सकता है (वास्तव में, वे आम तौर पर होते हैं), इसलिए वे उपयोगकर्ता इनपुट को मान्य करने के लिए उपयोगी नहीं हैं, उदाहरण के लिए।
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)
जोशुआ ब्लोच। * प्रभावी जावा *, आइटम 23: वैधता के लिए पैरामीटर जांचें। – artdanil
@thilo कीवर्ड पर जोर देने के लिए सही है, लेकिन वसंत Assert जैसे Assertion के बारे में विचार करें।
गुवा से ConditionalFailuresExplained देखें।
- पूर्वशर्त "आप (फोन करने वाले) में गड़बड़।"
- दावा "मैंने गड़बड़ की।"
- सत्यापन "कोई भी मैं गड़बड़ पर निर्भर करता हूं।"
- 1. सी # मुझे सूची का उपयोग कब करना चाहिए और मुझे सरणीसूची का उपयोग कब करना चाहिए?
- 2. मुझे सेफफोर्स का उपयोग कब करना चाहिए?
- 3. मुझे CompiledQuery का उपयोग कब करना चाहिए?
- 4. मुझे _aligned_malloc() का उपयोग कब करना चाहिए?
- 5. मुझे ConcurrentSkipListMap का उपयोग कब करना चाहिए?
- 6. मुझे GC.SuppressFinalize() का उपयोग कब करना चाहिए?
- 7. मुझे पैरामीटर का उपयोग कब करना चाहिए?
- 8. मुझे "स्वयं" कीवर्ड का उपयोग कब करना चाहिए?
- 9. मुझे std_logic_vector का उपयोग कब करना चाहिए और मुझे अन्य डेटा प्रकारों का उपयोग कब करना चाहिए?
- 10. उद्देश्य-सी में, मुझे कक्षा विधियों का उपयोग कब करना चाहिए और मुझे उदाहरण विधियों का उपयोग कब करना चाहिए?
- 11. मुझे ओरेकल की इंडेक्स संगठित तालिका का उपयोग कब करना चाहिए? या, मुझे कब नहीं चाहिए?
- 12. मुझे पेरर ("...") और fprintf (stderr, "...") का उपयोग कब करना चाहिए?
- 13. मुझे remove_reference और add_reference का उपयोग कब करना चाहिए?
- 14. मुझे इनलाइन के बजाय __forceinline का उपयोग कब करना चाहिए?
- 15. मुझे डेटाबेस का उपयोग कब शुरू करना चाहिए?
- 16. आपको जेसीआर का उपयोग कब करना चाहिए और आपको जेपीए/आरडीबीएमएस का उपयोग कब करना चाहिए?
- 17. django - मुझे media_root या static_root का उपयोग कब करना चाहिए?
- 18. मुझे जावास्क्रिप्ट फ्रेमवर्क लाइब्रेरी का उपयोग कब करना चाहिए?
- 19. मुझे बिल्डर डिजाइन पैटर्न का उपयोग कब करना चाहिए?
- 20. मुझे ऑब्जेक्ट डेटाबेस का उपयोग कब करना चाहिए?
- 21. मुझे MySQL संपीड़ित प्रोटोकॉल का उपयोग कब करना चाहिए?
- 22. मुझे जूमला में setUserState का उपयोग कब करना चाहिए?
- 23. (कब) मुझे PHP में टाइप संकेत का उपयोग करना चाहिए?
- 24. मुझे डोमेन विशिष्ट भाषा का उपयोग कब करना चाहिए?
- 25. मुझे सार्वजनिक/निजी/स्थिर तरीकों का उपयोग कब करना चाहिए?
- 26. मुझे पर्ल के ऑटोोलॉड का उपयोग कब करना चाहिए?
- 27. पायथन में, मुझे मेटा क्लास का उपयोग कब करना चाहिए?
- 28. मुझे अपने आवेदन में एसीएल का उपयोग कब करना चाहिए
- 29. मुझे अपने प्रश्नों में लेनदेन का उपयोग कब करना चाहिए?
- 30. मुझे html5 sessionStorage का उपयोग कब करना चाहिए?
संभावित डुप्लिकेट [आवेषण और अपवादों पर; जावा] (http://stackoverflow.com/questions/4863694/on-asserts-and-exceptions-java) –