2008-12-17 8 views
8

हाल ही में मैंने आंतरिक स्थिति को उजागर करने के बारे में FindBugs चेतावनियों पर काम किया, यानी जब सरणी की एक प्रति लौटने के बजाय किसी सरणी का संदर्भ वापस कर दिया गया था। मैंने उस कोड को परिवर्तित करने के लिए कुछ टेम्पलेट्स बनाए हैं।रक्षात्मक प्रोग्रामिंग के लिए संपादक टेम्पलेट

आप रक्षात्मक प्रोग्रामिंग का समर्थन करने के लिए किसने बनाया और एसओ भीड़ के साथ साझा करना चाहते हैं?

टेम्पलेट्स मैं अब तक बना लिया है (उदाहरण के रूप में):

(${o}!= null?(${type})${o}.clone():null) 
:

एक वस्तु क्लोन करने के लिए:

एक सरणी की एक प्रति एक विधि से वापस जाने के लिए बनाने के लिए

उत्तर

3

मैं एक टेम्पलेट के रूप होने की तरह एक "सुरक्षित" के बराबर होती है() परिभाषा:

/** 
* Implement equals based on ${cursor}. <br /> 
* See {@link #compareTo(Object) compareTo} 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
public boolean equals(final Object anObject) 
{ 
    boolean res = false; 
    if(anObject == null) { return false; } 
    if(anObject == this) { return true; } 
    if(anObject.getClass() == this.getClass()) 
    { 
     res = this.compareTo(anObject) == 0; 
    } 
    return res; 
} 

हमेशा Eq से बचने के लिए यह सुनिश्चित हो: सुपर क्लास में बराबर विधि ओवरराइड बराबर और सममित नहीं हो सकता है (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC) , जहां:

यह कक्षा एक समान विधि को परिभाषित करती है जो सुपरक्लास में बराबर विधि को ओवरराइड करता है। दोनों विधियों के तरीकों के बराबर होते हैं, यह निर्धारित करने के लिए कि दो वस्तुएं बराबर हैं या नहीं।

यह खतरे से भरा हुआ है, क्योंकि यह महत्वपूर्ण है कि बराबर विधि सममित है (दूसरे शब्दों में, a.equals(b) == b.equals(a))।
तो BA की एक उप-प्रकार है, और A की विधि चेकों के बराबर होती है कि तर्क एक instanceof A है, और बी की विधि की जाँच करता है कि तर्क एक instanceof B है के बराबर होती है, यह काफी संभावना है कि तुल्यता संबंध इन तरीकों से परिभाषित नहीं है सममित।


यह Comparable को लागू करने की कक्षाओं के लिए ही है और के लिए अनुमति देता है:

  • बराबरी के एक कार्यान्वयन जो हमेशा एक ही है;
  • सभी तुलनात्मक तर्क केवल एक ही स्थान पर स्थित होने के लिए (compareTo() फ़ंक्शन);
  • Comparable#compareTo() के जावाडोक के अनुपालन के साथ अनुपालन यह सुनिश्चित करने के लिए कि (x.compareTo(y)==0) == (x.equals(y)) (दृढ़ता से अनुशंसित है, लेकिन सख्त रूप से आवश्यक नहीं है)।
+0

मैं "बूलियन रेस" प्रारंभिकरण और कक्षा समानता परीक्षण को उलटा कर दूंगा। फिर "अन्य" कोड को "तब" खंड में स्थानांतरित किया जा सकता है। मुझे लगता है कि यह समझना आसान बनाता है और कम त्रुटि प्रवण होता है। –

+0

@ रैंडी: टेम्पलेट तय – VonC

+0

लेकिन यह टेम्पलेट केवल तभी काम करता है जब कक्षा तुलनात्मक, लागू हो? क्या आपके सभी वर्ग तुलनात्मक लागू करते हैं? यदि हां, तो क्या फायदे हैं और कोडिंग-ओवरहेड इसके लायक है? – dhiller

2

कोई टेम्पलेट नहीं है, लेकिन मैं System.arraycopy() के बजाय array.clone() का उपयोग करता हूं। उस के साथ कुछ गलत है?

संपादित करें: मैं का उपयोग करते हैं, विशेष रूप से कई तरीकों के साथ एक इंटरफेस के लिए एक डेकोरेटर को लागू करने, एक टेम्पलेट:

wrapped.${enclosing_method}(${enclosing_method_arguments}) 

यह एक लिपटे उदाहरण के लिए कॉल सौंपने से वर्तमान पद्धति के एक कार्यान्वयन उत्पन्न करता है, इस प्रकार की रोकथाम कॉपी/पेस्ट त्रुटियों।

+0

सरणी पर क्लोन ठीक है।एक अविश्वसनीय, गैर-अंतिम वस्तु पर क्लोन एक मुद्दा है क्योंकि क्लोन को कुछ बुरा/बेवकूफ करने के लिए अतिरंजित किया जा सकता है। –

+0

क्या यह स्रोत/जेनरेट प्रतिनिधि तरीके से अलग है? –

+0

तो java.util.Date का एक दुर्भावनापूर्ण कोडित सबक्लास क्लोन() ऑपरेशन को कुछ बुरा काम करने के लिए ओवरराइड कर सकता है, है ना? यदि ऐसा है, तो मुझे क्लोन टेम्पलेट को तदनुसार समायोजित करना चाहिए ... कोई सुझाव? – dhiller

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