2013-11-26 4 views
7

क्या यह सच नहीं है कि public चर के साथ कक्षा को Encapsulation में कमजोर माना जाता है और क्या यह एक खराब डिजाइन अभ्यास नहीं है?java.awt.Dimension में सार्वजनिक चर क्यों हैं?

यदि ऐसा है तो java.awt.Dimension में 2 सार्वजनिक चर width और height क्यों हैं?

+0

मुझे लगता है कि यहां तक ​​कि यदि ऐसे सार्वजनिक क्षेत्र हैं तो किसी को गेटर्स का उपयोग करना चाहिए। – Willmore

+0

@ MariusŽilėnas: या ...लेकिन चर बनाने के पीछे क्या कारण है? –

+1

आईएमएचओ, आपको मूल लेखक –

उत्तर

3

मुझे लगता है कि सार्वजनिक क्षेत्रों को उजागर करना स्वयं encapsulation का उल्लंघन नहीं है। Encapsulation इकाइयों की संपत्ति है, जो खुद को एक जटिल आंतरिक संरचना के अंदर छुपाएं। इस जटिल संरचना को सीधे एक्सेस नहीं किया जा सकता है और इसलिए टूटा जाने का जोखिम नहीं उठाया जा रहा है। यह केवल सार्वजनिक तरीकों के माध्यम से उपयोग किया जाता है, जो उनके काम को अच्छी तरह से बनाते हैं और जटिल आंतरिक संरचना को भ्रष्ट नहीं करते हैं। उदाहरण के लिए, हमारे पास HashMap के हैशटेबल तक पहुंच नहीं है और हम इसे भ्रष्ट नहीं कर सकते हैं। हम केवल get और put विधियों का उपयोग करते हैं, जो हैशटेबल राज्य की देखभाल ठीक से करते हैं। लेकिन Dimension ऑब्जेक्ट की जटिल संरचना कहां है? जब हम d.width = 23 लिखते हैं तो क्या चीजें टूट जाती हैं?

मुझे लगता है कि इस मामले में सार्वजनिक क्षेत्रों के बजाय सार्वजनिक गेटर्स/सेटर्स का उपयोग करने के कारण हैं: स्वाद और सम्मेलन। उत्तरार्द्ध अधिक महत्वपूर्ण है, मुझे लगता है। लेकिन यह इस सम्मेलन को लागू करने के लिए कहां और किस पर लागू होता है इस पर भी निर्भर करता है।

+0

मैं पूरी तरह से आपसे सहमत हूं। इसे स्पष्ट करने के लिए बहुत बहुत धन्यवाद। इसे एक पुराने पुराने कोड के रूप में दोष देने के बजाय, आपने गेटर और सेटर के उद्देश्य को समझाया है। इसके लिए +1 –

0

आयाम वास्तव में लंबे समय से आसपास रहा है और जावा के शुरुआती दिनों में प्रदर्शन के बारे में एक वास्तविक चिंता थी। इसलिए उन्होंने सार्वजनिक चर का उपयोग किया और इसे कुछ परिवर्तनीय बना दिया - केवल कुछ घड़ी चक्र प्राप्त करने के लिए दो प्रमुख गलतियों।

आप सभी लोग समयपूर्व अनुकूलन के बारे में प्रश्न पूछ रहे हैं, यहां एक अच्छा सबक सीख सकते हैं। (जोड़ा गया)

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

समस्या यह है कि आजकल सभी बहु-कोर प्रोसेसर और बहु-थ्रेडेड कोड के साथ आप अक्सर आयाम की रक्षात्मक प्रतियां बनाते हैं। वह "एडवांटेज", प्लस, कष्टप्रद और बग का स्रोत खोना।

+0

प्रतिक्रिया के लिए thx .. :) लेकिन मुझे संदेह है कि आप कह रहे हैं कि पहले चरण में आयाम की 'सार्वजनिक अंतिम ऊंचाई' थी? मुझे खेद है कि मेरा प्रश्न बेतुका लगता है, लेकिन मैं एक क्षेत्र को अपरिवर्तनीय बनाने के लिए 'अंतिम' से कुछ और नहीं सोच सकता। –

+0

मेरे पहले संपादन में एक टाइपो था। ऑब्जेक्ट सृजन पर "सहेजने" के लिए कक्षा हमेशा गैर-अंतिम फ़ील्ड के साथ उत्परिवर्तनीय रही है। आईएमओ, वे _should_ कक्षा को अंतिम चर के साथ अपरिवर्तनीय बना दिया है। – user949300

+0

मुझे अभी यह @ ** लिंक **] (http://web.mit.edu/java_v1.0.2/www/apibook/javag9.htm) @ashatte द्वारा प्रदान किया गया है, इसमें 'java.awt.color' है 'सार्वजनिक अंतिम' चर। और मेरा मानना ​​है कि दोनों 'आयाम' और 'रंग' को एक ही समय में कोड किया गया है, उन्होंने इसे 'आयाम' में अंतिम क्यों नहीं बनाया? –

1

आप आयाम के लिए JavaDoc को देखें, तो: http://docs.oracle.com/javase/7/docs/api/java/awt/Dimension.html

आपको लगता है कि सार्वजनिक क्षेत्रों 1.0 (1996) के बाद से वहाँ किया गया है देखेंगे। भाषा आज के साथ बनने वाली भाषा बनने के लिए कई सिद्धांतों और सर्वोत्तम प्रथाओं को समायोजित करने के लिए विकसित हुई है। इसमें 1.1 रिलीज के लिए एडब्ल्यूटी मॉडल का पुनर्विक्रय शामिल था, जिसमें इन क्षेत्रों के लिए जोड़े गए एक्सेसर्स और म्यूटेटर शामिल थे। http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/awt/HowToUpgrade.html

जो इस से उद्धृत किया गया है:

"इन परिवर्तनों को इस तरह के जीयूआई बिल्डरों और के रूप में कार्यक्रमों के लिए यह संभव बनाने के JavaBeans-

यहाँ JDK 1.1 रिहाई के लिए कुछ संग्रहीत रिलीज नोट्स हैं घटकों के गुणों को निर्धारित करने के लिए घटकों को क्वेरी करने के लिए प्रोग्राम का उपयोग करना। "

+0

प्रतिक्रिया के लिए धन्यवाद। लेकिन अगर आप इसे देख सकते हैं [** लिंक **] (http://web.mit.edu/java_v1.0.2/www/apibook/javag9.htm), तो आप देख सकते हैं कि 'java.awt.color' 'आयाम' वर्ग के साथ जारी किया गया था और इसमें म्यूटेटर उपलब्ध हैं। तो फिर क्यों है कि 'आयाम' में 'अंतिम' के रूप में चर नहीं है? –

+0

java.awt.color फ़ील्ड स्थिर हैं और आयाम फ़ील्ड नहीं हैं। इस मामले में java.awt.color विधियां सार्वजनिक क्यों हैं एक पूरी तरह से अलग सवाल है। –

+0

मेरा बुरा ... मैं 'स्थिर 'नोटिस करने में विफल रहा .. –

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