2009-10-30 14 views
6
class Creature {  
    private int yearOfBirth=10; 

    public void setYearOfBirth(int year) { 
     yearOfBirth = year; 
    } 

    void setYearOfBirth(Creature other) { 
     yearOfBirth = other.yearOfBirth; // is this correct it compiles fine 
    } 

    int getYearOfBirth() { 
     return yearOfBirth; 
    } 

    public static void main(String args[]) 
    { 
     Creature c = new Creature(); 
     c.setYearOfBirth(89); 

     Creature d = new Creature(); 
     c.setYearOfBirth(d); 

     System.out.println(c.yearOfBirth); 
    } 
} 

क्या इस कोड में कोई गलती है?क्या इस जावा कोड में कोई गलती है?

"अन्य .yearOfBirth" गलत है? मेरे संकाय का कहना है कि यह गलत है लेकिन यह मेरे लिए ठीक काम करता है।

+1

उपवास (पता नहीं क्यों इसे डाउनवॉट किया गया था) - यह मेरे लिए एक बिल्कुल अच्छा शुरुआती स्तर का प्रश्न प्रतीत होता है। – paxdiablo

+3

आपका संकाय यह इंगित कर रहा है कि आप 'getYearOfBirth()' (JavaBean access) के माध्यम से सीधे 'निजी' चर 'वर्षऑफबर्थ' तक पहुंच रहे हैं। एकमात्र कारण आप ऐसा करने में सक्षम हैं और यह संकलित करता है क्योंकि 'निजी' डेटा उसी कक्षा के किसी भी उदाहरण से सुलभ है। यदि आपने 'गैर-निर्माण' कक्षा से सीधे 'वर्षऑफबर्थ' तक पहुंचने का प्रयास किया था तो संकलक निश्चित रूप से फिट होगा और आपको 'सार्वजनिक' विधि 'getYearOfBirth() 'का उपयोग करना होगा। –

उत्तर

5

आपको क्यों समझाने के लिए अपने संकाय से पूछना है कि उन्हें लगता है कि यह गलत है (शायद यह शैली का सवाल है, या यहां तक ​​कि एक गलतफहमी), ताकि आप इससे सीख सकें।

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

यदि दूसरी तरफ आपको बताया जाता है कि आप कुछ गलत हैं तो आप निजी तौर पर दूर जाते हैं और सामान्य इंटरनेट समुदाय से पूछते हैं, आपको एक जोखिम है कि आपको बताया जाएगा कि आप सही हैं और आप समाप्त हो जाएंगे आपके शिक्षकों पर श्रेष्ठता की झूठी भावना जो बहुत प्रतिकूल होगी।

+0

आप * संकाय से पूछ सकते हैं, या आप यहां हजारों जावा कोडर से पूछ सकते हैं, जिनमें से कई आपको बड़ी लंबाई में बताएंगे कि समस्याएं क्या हैं, शायद उस बिंदु पर जहां आप सुनने से अपने कानों को काट लेंगे उनके लिए अब और भी :-) – paxdiablo

+3

इसे सीखने के अनुभव के रूप में देखें। क्या यह गलत है क्योंकि यह संकलित नहीं करता है? या यह गलत है क्योंकि यद्यपि यह संकलित करता है, एक समस्या है। या यह गलत है क्योंकि यह हल करने के लिए कहा गया समस्या हल नहीं करता है? वहां बहुत सारे उत्पादन कोड हैं जो काम करते हैं, लेकिन अभी भी सादा गलत है! –

+0

मुझे लगता है कि यह एक अच्छा मुद्दा है, और यह व्यापारिक दुनिया में भी बढ़ सकता है। कभी-कभी आपको ऐसा कुछ करने के लिए कहा जा सकता है, जो कि आप अन्यथा ऐसा नहीं करते हैं, शायद गलत तरीके से भी ऐसा लगता है ... यह समझना अच्छा होता है कि आप इसे इस तरह से करने की ज़रूरत क्यों कर सकते हैं, इसलिए तो आप जानते हैं कि अपने मालिक/सहकर्मी/प्रशिक्षक को कैसे प्रसन्न किया जाए और यह भी पता चले कि अगर आप शामिल नहीं थे तो आप यह कैसे करेंगे। –

-2

यह गलत है क्योंकि आप किसी अन्य ऑब्जेक्ट के किसी निजी सदस्य (आपने private int yearOfBirth घोषित किया है) का उपयोग कर रहे हैं, हालांकि कक्षा का प्रकार समान है। आपको इसके बजाय परिभाषित सार्वजनिक गेटटर का उपयोग करना चाहिए: yearOfBirth = other.getYearOfBirth()

+0

यह गलत क्यों है? – Jesper

+0

यह उत्तर मुख्य में System.out.println() कॉल से निजी सदस्य पहुंच पर भी लागू होता है। – highlycaffeinated

+1

स्टाइल बहस योग्य है लेकिन यह गलत कह रहा है ठीक है .. गलत: पी – NickDK

-2

yearofBirth एक निजी int है। इसलिए other.yearOfBirth पर कॉल संभवतः असफल हो जाएगा ...

+2

नहीं, यह नहीं होगा, अगर यह एक ही कक्षा के अंदर है। – Jesper

+2

भले ही यह स्पष्ट रूप से असफल न हो, फिर भी यह गलत है। गेटटर विधियों को लागू करने का मुद्दा उनका उपयोग करना है। – Allyn

7

जैसा लिखा गया है, यह आपके द्वारा खोजे जाने पर काम करेगा। मुझे संदेह है कि खेल में मौलिक गलतफहमी है, हालांकि।

मेरे मानसिक शक्तियों ने मुझे बताया कि अपने प्रशिक्षक निम्नलिखित की तरह कोड अधिक की उम्मीद:

class Creature {  
    private int yearOfBirth=10; 

    public void setYearOfBirth(int year) { 
     yearOfBirth = year; 
    } 

    public void setYearOfBirth(Creature other) { 
     yearOfBirth = other.yearOfBirth; 
    } 

    public int getYearOfBirth() { 
     return yearOfBirth; 
    } 
} 

class Program { 
    public static void main(String args[]) { 
     Creature c = new Creature(); 
     c.setYearOfBirth(89); 

     Creature d = new Creature(); 
     c.setYearOfBirth(d); 

     System.out.println(c.yearOfBirth); // This will not compile 
    } 
} 

गलतफहमी है कि आप केवल एक बना लिया है class-- अपने मुख्य आवेदन वर्ग। यह प्रभावी रूप से yearOfBirth एक प्रकार का संकर वैश्विक मूल्य बनाता है जिसे आप अपनी मुख्य विधि से एक्सेस कर सकते हैं। अधिक विशिष्ट डिजाइनों में, Creature एक ऐसी कक्षा है जो आपकी मुख्य विधि से पूरी तरह से स्वतंत्र है। उस स्थिति में, आपको केवल Creature को public इंटरफ़ेस के माध्यम से एक्सेस करना होगा। आप सीधे अपने निजी क्षेत्र तक पहुंच नहीं पाएंगे।


(वहाँ किसी भी pedants के लिए नोट: हाँ, मैं जानता हूँ कि मैं सरल बनाने रहा हूँ।)

+1

अच्छी तरह से विश्लेषण किया गया। किसी भी तरह, आप त्वरित डेमो उद्देश्य के लिए उपयोग किए गए सरलीकृत कोड की सीमा भी दिखाते हैं, जो उनके सीमित वातावरण में काम करता है लेकिन वास्तविक उपयोग में गलत है। अंततः संक्षेप में और इतने पर धाराओं को बंद करने के लिए छोड़ रहे इन स्निपेटों के समान। – PhiLho

+0

हाँ यह सही है कि मैंने कोशिश की और उसे पता चला लेकिन मेरा सवाल "वर्ष ओफबर्थ = अन्य। प्रिय ओफबर्थ" यह वर्ग प्राणी में काम करेगा? अगर मैं अपने ग्रहण आईडी – Arunachalam

+0

में क्लास प्राणी को संकलित करता हूं तो यह ठीक काम करता है, मैं व्यक्तिगत रूप से 'वर्षऑफबर्थ = अन्य.यायरऑफबर्थ' को किसी उद्देश्य से खराब नहीं मानता। एक वर्ग अपने आंतरिकों को समझ और समझ सकता है और उन्हें सुरक्षित रूप से कैसे कुशलतापूर्वक उपयोग करना चाहिए। एक में दो वर्गों का विलय और आपकी मुख्य विधि से c.yearOfBirth का संदर्भ देना कुछ ऐसा है जो मैं कानूनी होने की संभावना कम मानता हूं। –

0

नहीं है, वहाँ कोई समस्या नहीं बिल्कुल भी इसके साथ है।

देखो, यह दर्शक राय पर निर्भर करता है। लेकिन किसी दिए गए संदर्भ के लिए यह कोड बिल्कुल सही हो सकता है।

किसी अन्य संदर्भ के लिए यह सही नहीं हो सकता है। तो यह इस बात पर निर्भर करता है कि कैसे उपयोग किया जा रहा है।

  • एक निजी सदस्य को एक्सेस करना एक और उदाहरण से सीधे, सही नहीं है (हमेशा वांछनीय हालांकि, उदाहरण के लिए जब आप उपवर्गीकरण रहे हैं के लिए) यही कारण है कि यह पहली जगह में private है है।आप कह रहे हैं "अरे, यह मेरा है और मुझे पता है कि इसका उपयोग कैसे करें"

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

शायद एकमात्र चीज जो मैं जोड़ूंगा वह कक्षा को अंतिम बनाना है।

final class Creature 

आप इसे दाय आप शायद yearOfBirth विशेषता के लिए प्राप्त/सेट की समीक्षा करने के लिए है बनाना चाहते हैं, लेकिन वे जिस तरह से यह है मेरे लिए एकदम सही है।

अब सबसे महत्वपूर्ण यहाँ बात है, कि आप समझ क्या अपने कोड के प्रत्येक भाग करता है, और यह कैसे अपने व्यवहार को प्रभावित करता है।

आपको भाग्य द्वारा कोई कोड नहीं चाहिए (क्षमा करें मुझे नहीं पता कि इसके लिए सही अभिव्यक्ति क्या है) लेकिन आपको पता होना चाहिए कि जब भी आप कुछ टाइप करते हैं तो आप क्या कर रहे हैं, और आप कैसे उपयोग करना चाहते हैं ।

0

मैं दो "मुद्दों," देख, हालांकि मैं उन्हें कॉल करने में संकोच गलतियों:

  1. आप स्पष्ट रूप से 89 के रूप में प्राणी की उम्र स्थापित कर रहे हैं, और फिर अप्रारंभीकृत डिफ़ॉल्ट के साथ उस उम्र पुनर्लेखन (!) जीव डी। यदि आप यही करना चाहते हैं, तो ठीक है, लेकिन कम से कम आप कुछ चक्रों को बर्बाद कर रहे हैं ताकि आप उस मूल्य को निर्धारित कर सकें जिसे आप बाद में फेंकना चाहते हैं।

  2. आप संभावित रूप से जावाबीन नामकरण सम्मेलनों का उल्लंघन कर रहे हैं।

उत्तरार्द्ध बिंदु व्याख्या करने के लिए: जावा पुस्तकालयों और चौखटे (विशेष रूप से JSP) का एक बहुत एक घटक के रूप वस्तु के इलाज के लिए JavaBeans पर भरोसा करते हैं। मैंने उपयोग की जाने वाली वास्तविक तंत्र में गहराई से डाला नहीं है, लेकिन मैंने जो पढ़ा है, उससे यह गुणों और उन गुणों के प्रकारों का अनुमान लगाने के लिए जावाबींस कक्षा के आत्मनिरीक्षण पर निर्भर करता है। एक इंट और एक प्राणी दोनों को स्वीकार करने के लिए अपने सेटर सेट YearOfBirth() को अधिभारित करके, आप आत्मनिरीक्षण को फेंक सकते हैं। (Java12eans के लिए एक सभ्य परिचय के लिए here देखें।)

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

class Creature {  
    private int yearOfBirth=10; 

    public void setYearOfBirth(int year) { 
     yearOfBirth = year; 
    } 

    int getYearOfBirth() { 
     return yearOfBirth; 
    } 

    public static void main(String args[]) 
    { 
     Creature c = new Creature(); 
     c.setYearOfBirth(89); 

     Creature d = new Creature(); 
     c.setYearOfBirth(d.getYearOfBirth()); 

     System.out.println(c.getYearOfBirth()); 
    } 
} 

अब yearOfBirth तक आपकी पहुंच के सभी सार्वजनिक गेटर विधियों के माध्यम से आता है, जो कैप्सूलीकरण मदद करता है, और अपने मुख्य यदि तोड़ने से कोड पाएगा विधि दूसरे वर्ग में जाती है। (ग्रेग डी के रूप में सही ढंग से बताया।)

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

1

मुझे कुछ भी गलत नहीं पता है।

कोड काम करता है, क्योंकि एक उदाहरण या कक्षा एक ही कक्षा के अन्य उदाहरणों के निजी सदस्यों तक पहुंच सकती है। यह डिजाइन द्वारा है।

+0

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

+0

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

+0

"उसी वर्ग के अन्य उदाहरणों के निजी सदस्यों तक पहुंच सकते हैं" - वास्तव में मुझे जावा के लगातार उपयोग के बावजूद यह नहीं पता था। यह किसी भी तरह गंदे लगता है :-) +1 मेरे ज्ञान का विस्तार करने के लिए। – paxdiablo

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