मैं final
विधि पैरामीटर और स्थानीय चर को कोड शोर मानता हूं । जावा विधि घोषणाएं काफी लंबी हो सकती हैं (विशेष रूप से जेनरिक के साथ) - उन्हें अब और बनाने की कोई आवश्यकता नहीं है।
यदि यूनिट परीक्षण ठीक से लिखे गए हैं, तो "हानिकारक" मापदंडों को निर्दिष्ट करना उठाया जाएगा, इसलिए यह वास्तव में कभी भी समस्या नहीं होनी चाहिए । विज़ुअल क्लैरिटी एक संभावित बग से बचने से ज्यादा महत्वपूर्ण है, जिसे उठाया नहीं गया है क्योंकि आपके यूनिट परीक्षणों में अपर्याप्त कवरेज है।
FindBugs और CheckStyle जैसे उपकरण जिन्हें निर्माण को तोड़ने के लिए कॉन्फ़िगर किया जा सकता है यदि असाइनमेंट को पैरामीटर या स्थानीय चर के लिए बनाया गया है, अगर आप ऐसी चीजों के बारे में गहराई से ध्यान रखते हैं।
बेशक, यदि आपको उन्हें अंतिम रूप देने की आवश्यकता है, उदाहरण के लिए क्योंकि आप एक अनाम वर्ग में मूल्य का उपयोग कर रहे हैं, तो कोई समस्या नहीं है - यह सबसे सरल सबसे साफ समाधान है।
अपने मापदंडों में अतिरिक्त कीवर्ड जोड़ने के स्पष्ट प्रभाव के अलावा, और जिससे IMHO उन्हें छलाँग लगाता है, अंतिम रूप से विधि मापदंडों को जोड़कर अक्सर विधि बॉडी में कोड को कम पठनीय बनाया जा सकता है, जो कोड को बदतर बनाता है - "अच्छा" होने के लिए, कोड जितना संभव हो उतना पठनीय और सरल होना चाहिए। एक आकस्मिक उदाहरण के लिए, कहो कि मेरे पास एक तरीका है जिसे असंवेदनशील तरीके से काम करने की आवश्यकता है।
इसके बिना final
:
public void doSomething(String input) {
input = input.toLowerCase();
// do a few things with input
}
सरल। स्वच्छ। हर कोई जानता है कि क्या हो रहा है।
अब 'अंतिम' के साथ, विकल्प 1:
public void doSomething(final String input) {
final String lowercaseInput = input.toLowerCase();
// do a few things with lowercaseInput
}
मापदंडों को बनाते समय final
कोडर को जोड़ने से यह सोचकर कि वह मूल मूल्य के साथ काम कर रहा है, से नीचे रोक देता है, एक समान जोखिम है कि कोड नीचे और नीचे उपयोग कर सकता input
है lowercaseInput
, जिसे इसे नहीं करना चाहिए और जिसके खिलाफ आपकी रक्षा नहीं की जा सकती, क्योंकि आप कर सकते हैं ' टी इसे दायरे से बाहर ले जाएं (या यहां तक कि अगर यह भी मदद करेगा तो असाइन null
करें input
)।
'अंतिम' के साथ, विकल्प 2:
public void doSomething(final String input) {
// do a few things with input.toLowerCase()
}
अब हम सिर्फ और भी अधिक कोड शोर बना रहे हैं और एक प्रदर्शन हिट शुरू करने के लिए toLowerCase()
n बार आह्वान किया है।
'अंतिम' के साथ, विकल्प 3:
public void doSomething(final String input) {
doSomethingPrivate(input.toLowerCase());
}
/** @throws IllegalArgumentException if input not all lower case */
private void doSomethingPrivate(final String input) {
if (!input.equals(input.toLowerCase())) {
throw new IllegalArgumentException("input not lowercase");
}
// do a few things with input
}
कोड शोर के बारे में बात करें। यह एक ट्रेन का कहर है। हमें एक नई विधि, एक आवश्यक अपवाद ब्लॉक मिला है, क्योंकि अन्य कोड इसे गलत तरीके से लागू कर सकते हैं। अपवाद को कवर करने के लिए अधिक इकाई परीक्षण। सभी एक सरल, और IMHO से बचने के लिए बेहतर और हानिरहित, लाइन।
यह भी समस्या है कि विधियां इतनी लंबी नहीं होनी चाहिए कि आप आसानी से इसे नेत्रहीन रूप से नहीं ले सकते हैं और एक नज़र में जानते हैं कि पैरामीटर के लिए एक असाइनमेंट हुआ है।
मुझे लगता है कि यह अच्छा अभ्यास / शैली है कि अगर आप किसी पैरामीटर को असाइन करते हैं, तो आप इसे हर विधि में जल्दी करते हैं, अधिमानतः पहली पंक्ति या सीधे बुनियादी इनपुट जाँच के बाद, प्रभावी रूप से इसे पूरी विधि के लिए प्रतिस्थापित करते हैं , जिसका लगातार प्रभाव होता है। तरीका। पाठक किसी भी असाइनमेंट के स्पष्ट होने की उम्मीद करना जानते हैं (हस्ताक्षर की घोषणा के पास) और एक सुसंगत स्थान पर, जो उस समस्या को बहुत कम करता है जो अंतिम जोड़ने से बचने की कोशिश कर रहा है। वास्तव में मैं शायद ही कभी मापदंडों को असाइन करता हूं, लेकिन अगर मैं करता हूं तो मैं हमेशा इसे एक विधि के शीर्ष पर करता हूं।
ध्यान दें कि final
यह वास्तव में आपकी रक्षा नहीं करता है जैसे कि यह पहली बार लगता है:
public void foo(final Date date) {
date.setTime(0);
// code that uses date
}
final
जब तक पैरामीटर प्रकार आदिम या अपरिवर्तनीय नहीं है, तब तक आप पूरी तरह से रक्षा नहीं करते हैं।