2011-10-04 11 views
9

एक (पैडेंटिक) शुरुआती जावा प्रोग्रामर के रूप में मैं जानना चाहता हूं, क्या कोड के एक सामान्य ब्लॉक को स्थानांतरित करने के लिए यह एक अच्छा अभ्यास है कि सभी सबक्लास एक अलग पर उपयोग करते हैं सुरक्षित (अंतिम) मूल वर्ग में विधि? सामान्य मानों, या सामान्य फ़िल्टरिंग एल्गोरिदम, आदि के साथ सूचियां भरने जैसे कार्य ... क्या संरक्षित स्थिर विधियों का भी उपयोग करना अच्छा है?सबक्लास के लिए सामान्य कोड रखने के लिए सुपरक्लास "संरक्षित अंतिम" विधियों का उपयोग

class A { 
    protected final List<String> getVariants() {...} 
    protected final List<String> filterResults(List<String> variants) {...} 
} 

class B extends A { 
    public List<String> doSomethingUsefull() { 
     List<String> commonVariants = getVariants(); 
     ... 
     return filterResults(commonVariants); 
    } 
} 

class C extends A { 
    public void doSomethingUsefull() { 
     List<String> commonVariants = getVariants(); 
     ... 
     return filterResults(commonVariants); 
    } 

    public void doMoreUsefullThings() { 
     List<String> commonVariants = getVariants(); 
     ... 
     return filterResults(commonVariants); 
    } 
} 

उत्तर

19

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

  • OO शुद्धतावादियों static से बचने के लिए, क्योंकि यह OO प्रतिमान टूट जाता है आपको सलाह देगा:

    यहाँ एक ही रास्ता final, protected, और static कीवर्ड मिश्रण के बारे में सोचना है।

  • बेशक, final कीवर्ड का उपयोग करके सबक्लास को विधि को ओवरराइड करने से रोकता है। इस संबंध में, परिणाम static जैसा ही है।
  • final अधिक बार इस्तेमाल किया जाना चाहिए, और यह एक अच्छा विचार इसके साथ उपयोग करने के लिए protected साथ है। "प्रभावी जावा" में आइटम 17 देखें।
  • protected और static अक्सर एक साथ उपयोग नहीं किया जाता है। आप एक ओओ निर्माण को एक ऐसे निर्माण के साथ मिश्रित करेंगे जो सामान्य ओओ व्यवहार को तोड़ देता है, इसलिए संयोजन अजीब है।
+2

इसे अभी पढ़ना। – dmzkrsk

+0

स्थैतिक इतना बुरा नहीं है ... उदाहरण के लिए, ब्लॉच कारखानों के निर्माण के लिए अपने उपयोग की सिफारिश करता है। और निश्चित रूप से, हम नहीं चाहते हैं कि Math.floor() को गणित के उदाहरण की आवश्यकता हो! यह उपयोगी हो सकता है, लेकिन निश्चित रूप से देखभाल के साथ प्रयोग किया जाता है। – PhiLho

+2

मैं सहमत हूं, लेकिन एक शुद्धवादी ने मुझे केवल विपरीत के बारे में मनाने की कोशिश की: कि 'मठ' विधियों को स्थिर नहीं होना चाहिए! – jtoberon

4

यह मेरे लिए उचित लगता है - यद्यपि आपको A सार बनाने के लिए चाहते हो सकता है। इसके अलावा बजाय रचना उपयोग करने पर विचार - B और Cयह उपवर्गीकरण के बजाय एक A हो सकता है?

+1

विरासत पर संरचना! परीक्षण करने के लिए बहुत आसान है, +1 – Guillaume

+0

ऐसा लगता है कि मेरे मामले में बहुत अच्छी तरह से काम कर सकता है। मैं कोशिश कर रहा हूँ! – dmzkrsk

0

मैं स्थिर वर्ग को अलग करने के अगर वे कुछ वर्ग क्षेत्रों पर निर्भर नहीं है यह सब तरीकों को स्थानांतरित करने का प्रस्ताव था। उन्हें उपयोग विधियों बनाओ।

2

सबसे पहले, आपको इस उद्देश्य तक विस्तार का उपयोग नहीं करना चाहिए क्योंकि बहुत अधिक विस्तार करना हमेशा बुरा विचार है।

दूसरे, आप पूरी तरह से सही है कि आप अपने कोड को दोहराना नहीं है कर रहे हैं, लेकिन कोड के बार-बार हिस्सा द्वारा यह समूहीकरण अच्छा विकल्प नहीं है। वरीयता के स्तर से चीजों को समूहीकृत करना वास्तविक दुनिया में वास्तविक अर्थ है।

इतना ही नहीं बल्कि, आप शक है जब: अलग है या नहीं, विस्तार या रचना, अंतिम संरक्षित या केवल रक्षा की, इस वर्ग के लिए लिखने इकाई परीक्षण कोशिश करते हैं और जवाब बहुत तेजी से आ जाएगा।

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