मैं एक गेम लिख रहा हूं और मेरे पास इनपुट के लिए एक कक्षा है जिसमें सभी अलग-अलग कुंजियों के लिए बूलियन शामिल हैं। मैं मुख्य कक्षा वर्ग में इस वर्ग का एक उदाहरण बना देता हूं। क्या बुलियन जनता के लिए ठीक है, या मुझे एक्सेसर्स के साथ उन्हें एक्सेस करना चाहिए?क्या गैर-स्थैतिक वर्ग में सार्वजनिक चर होना बुरा है?
उत्तर
इसके बजाय प्रत्येक कुंजी के लिए एक boolean
होने के लिए, यह अधिक पठनीय और आसान कोड करने के लिए यदि आप एक private Map<String, Boolean> keyStates
था, के साथ सभी चाबियाँ false
के लिए शुरू हो जाएगा।फिर अपने accessors हो सकता है:
public void setPressed(String keyName) {
keyStates.put(keyName, true);
}
public void setReleased(String keyName) {
keyStates.put(keyName, false);
}
public boolean isPressed(String keyName) {
return keyStates.get(keyName);
}
सार्वजनिक चर एक्सेसर तरीकों के बजाय होने के लिए सामान्य कारण यह है कि यह वर्ग वर्गों है कि उसके सदस्यों के साथ बातचीत में परिवर्तन की आवश्यकता के बिना इसके कार्यान्वयन बदलने की अनुमति देता है। उदाहरण के लिए, उपर्युक्त के साथ, अब आप गणना करने के लिए कोड जोड़ सकते हैं या कुंजी प्रेस लॉग कर सकते हैं, या अंतर्निहित प्रकार Map
को किसी भी को बाहर के बिना उजागर किए बिना बदल सकते हैं।
यह व्यक्तिगत वरीयता नहीं है। Encapsulation और Interfaces ओओ सॉफ्टवेयर इंजीनियरिंग के अभिन्न अंग हैं, और प्राथमिक डिजाइन कारण हैं कि इंटरनेट तकनीकी पीओवी से संभव है।
धन्यवाद! यह वास्तव में एक अच्छी विधि की तरह दिखता है। – user1150769
मानक अभ्यास सदस्य चर या तो जावा बीन सम्मेलन का पालन करने वाले गेटर्स/सेटर्स के साथ संरक्षित या निजी बनाना है। यह कुछ हद तक वर्बोज़ होता है, लेकिन वहाँ एक बहुत अच्छी लाइब्रेरी (www.projectlombok.org) है जो गेटर्स/सेटर्स/कन्स्ट्रक्टर/टूस्ट्रिंग/हैशकोड/आपके लिए समान तरीकों को उत्पन्न करती है।
आम तौर पर मैं गेटर्स और सेटर्स का उपयोग करने की सलाह दूंगा क्योंकि यह क्लीनर, अधिक संगठित और अधिक पठनीय है। इससे आपकी मदद भी होगी यदि आपके पास अपने कोड को देखने वाले बहुत से प्रोग्रामर हैं। मेरा दृष्टिकोण हमेशा आपके चर को निजी बनाना है जब तक कि आपको किसी विशिष्ट कारण के लिए उन्हें बेनकाब करने की आवश्यकता न हो। यदि प्रदर्शन वास्तव में आपके गेम में एक मुद्दा है तो अपने चर सार्वजनिक बनाने से फ़ंक्शन कॉल को कम करके थोड़ा सा मदद मिलेगी।
यह हमेशा निजी के रूप में वर्ग चर घोषित करने और जब तक इसकी वास्तव में उन्हें जनता के रूप में घोषित करने के लिए आवश्यक सार्वजनिक मनुष्य और सेटर तरीके से उन तक पहुँचने के लिए एक अच्छा जावा प्रोग्रामिंग अभ्यास है।
आप एक IDE का उपयोग कर रहे है, तो इसका बस एक क्लिक दूर वर्ग चर/सदस्य चर के लिए getters और setters उत्पन्न करने के लिए।
यह बुरा नहीं है, लेकिन आम तौर पर आप encapsulate को एक वस्तु का राज्य चाहता हूँ।
यह मुख्य रूप से एक व्यक्तिगत स्वाद की बात है - मुझे यकीन है कि आप दोनों पक्षों पर बहस कर लोगों मिल जाएगा हूँ, और मैं इसे काला या सफेद नहीं है, लेकिन कैसे "बड़ी" वर्ग है पर निर्भर करता है कहेंगे।
getters और setters का उपयोग कर के लिए तर्क है ताकि आप बाहर सार एक क्षेत्र के रूप वास्तविक प्रतिनिधित्व, आपको स्वतंत्रता जैसे के रूप में इस प्रस्तुत करना शुरू करना देने के लिए आपके इंटरफेस को बदले बिना व्युत्पन्न मूल्य। तो वास्तव में यह नीचे आता है कि इस वर्ग के लिए इंटरफ़ेस आपके लिए कितना मूल्यवान है।
यदि यह आपके प्रथम श्रेणी के सार्वजनिक इंटरफ़ेस का हिस्सा है, तो निश्चित रूप से गेटर्स और सेटर्स का उपयोग करें। दूसरी चरम पर, यदि यह एक साधारण डेटा धारक है जो टुपल की तरह है जो पूरी तरह से एक वर्ग के भीतर उपयोग किया जाता है (उदा। किसी अन्य वर्ग में परिवर्तन से पहले डेटाबेस पंक्तियों को मैप करने के लिए), तो मैं फ़ील्ड का उपयोग करने में संकोच नहीं करूंगा; इंटरफ़ेस के लिए कोई वास्तविक मूल्य नहीं है क्योंकि यह केवल आंतरिक रूप से उपयोग किया जा रहा है।
तो इस कक्षा का कितना वर्ग/पैकेज उपयोग करेंगे? यदि यह एक निजी, "स्थानीय" वर्ग है तो मुझे नहीं लगता कि केवल फ़ील्ड का उपयोग करने में कुछ भी गलत है, और यदि कभी इसे बदलने की जरूरत है तो अपने कॉलर्स को अपडेट करना।
तक पहुँचना क्षेत्रों में ज्यादा सही ठहराने के लिए अगर वे final
भी कर रहे हैं, जो अक्सर वस्तु की इस तरह के साथ मामला है आसान है।
और अब आपको गेटर और सेटर्स का उपयोग करने के लिए कहा गया है, और क्योंकि आप जावा में हैं (जहां आईडीई आपको गेटर्स/सेटर्स को तुच्छ रूप से बनाने में मदद करते हैं, और हर कोई स्पष्ट रूप से उनका उपयोग करता है), इस थ्रेड को मदद के लिए पढ़ें उनमें से अपने उपयोग के लिए कुछ संतुलन जोड़ें:
- 1. सार्वजनिक वर्ग चर सेट करना
- 2. क्या 'eval' बुरा होना चाहिए?
- 3. में सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए, है ना?
- 4. क्यों जुनीट में @ रूल एनोटेटेड फ़ील्ड सार्वजनिक होना चाहिए?
- 5. वीबीए में सार्वजनिक ऑब्जेक्ट मॉड्यूल क्या है?
- 6. क्या "कार्यान्वयन-केवल" वर्ग के सदस्य होना संभव है?
- 7. क्या सार्वजनिक संपत्ति, मित्र और VB6 में सार्वजनिक चर के बीच अंतर है
- 8. क्या कम चर को ओवरराइड करना बुरा व्यवहार है?
- 9. सार्वजनिक स्थैतिक चर मूल्य
- 10. क्या उद्देश्य-सी वर्ग वर्ग चर का समर्थन करता है?
- 11. क्यों सार्वजनिक ऑब्जेक्ट पर लॉक करना एक बुरा विचार है
- 12. अनुबंध वर्ग एक अमूर्त वर्ग होना चाहिए
- 13. डीडीडी + सार्वजनिक पैरामीटर रहित रचनाकार - क्या वे मौजूद होना चाहिए?
- 14. JSHint एक चर-इन चर 'बुरा' मानता है। इसका क्या मतलब है?
- 15. क्या प्रत्येक वर्ग में आभासी विनाशक होना चाहिए?
- 16. हैडोप में क्या मैपर और रेड्यूसर स्थिर वर्ग होना चाहिए?
- 17. क्या मुख्य वर्ग में हर विधि स्थिर होना चाहिए?
- 18. क्या खाली कक्षा घोषित करना बुरा है?
- 19. सार्वजनिक चर जोड़ने पर क्रैश
- 20. क्या यह सूची में बुरा है?
- 21. क्या MySQL वास्तव में यह बुरा है?
- 22. किस स्थिति में "आंशिक वर्ग" होना अच्छा है?
- 23. क्या इस मामले में सार्वजनिक जावा क्लास के सदस्यों के लिए बुरा व्यवहार होगा?
- 24. वैश्विक चर के लिए डिफ़ॉल्ट भंडारण वर्ग क्या है?
- 25. क्या यह गैर-क्लस्टर्ड इंडेक्स होना बुरा है जिसमें क्लस्टर्ड इंडेक्स से प्राथमिक कुंजी है?
- 26. दीप वर्ग विरासत पदानुक्रम - बुरा विचार?
- 27. क्या मैं व्युत्पन्न कक्षा में सार्वजनिक सदस्य चर निजी बना सकता हूं?
- 28. सार्वजनिक या निजी, यह वास्तव में एंड्रॉयड चर
- 29. क्या तरीकों के अंदर तरीके होना संभव है?
- 30. "() वी" वर्ग हस्ताक्षर में क्या मतलब है?
जब भी आपको वास्तव में –
@JimmyGustafsson: क्यों ?? अगर गेटर्स/सेटर्स वास्तव में कुछ और नहीं करते हैं लेकिन मूल्यों को प्राप्त/सेट करते हैं, तो उन्हें सार्वजनिक क्यों न करें? –
बूलियन _about_ कुंजी का प्रतिनिधित्व करते हैं? – paislee