जावा कुछ वर्गों के साथ एनकैप्सुलेशन का उपयोग क्यों नहीं करता है?


25

मेरा प्रश्न कक्षाओं System.inऔर System.out(मानक पुस्तकालय में उन लोगों की तरह हो सकता है) से संबंधित है। ऐसा क्यों है? OOP में एक बुरा अभ्यास नहीं है? क्या इसका उपयोग नहीं किया जाना चाहिए: System.getIn()और System.getOut()? मेरा हमेशा यह सवाल रहा है और मुझे उम्मीद है कि मुझे यहां अच्छा जवाब मिल सकता है।

जवाबों:


36

वर्ग के भीतर inऔर outखेतों के लिए परिभाषा Systemहैं:

public final static PrintStream out;
public final static InputStream in;

ये स्थिरांक हैं। वे ऑब्जेक्ट्स भी होते हैं, लेकिन वे स्थिरांक हैं। यह मठ वर्ग के समान है:

public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;

या बूलियन वर्ग में:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

या रंग वर्ग में:

public final static Color white     = new Color(255, 255, 255);
public final static Color black     = new Color(0, 0, 0);
public final static Color red       = new Color(255, 0, 0);

जब एक सार्वजनिक स्थिरांक तक पहुंच होती है जो नहीं बदलती है, तो इसे एन्कैप्सुलेट करने के लिए एक महत्वपूर्ण लाभ नहीं है - वैचारिक या प्रदर्शन आधारित। यह वहाँ है। यह बदलने वाला नहीं है।

कोई वास्तविक अंतर नहीं है Color.whiteऔर System.out


खैर, मैंने इसे इस तरह से नहीं देखा है, वे निरंतर वस्तुएं हैं। यह एक बहुत अच्छी व्याख्या है।
Clawdidr

1
आज के जावा में @Clawdidr, कोई उन्हें पकड़ने के लिए उपयोग करने पर विचार कर सकताenum है ... हालाँकि enumजावा 1.5 के साथ नया था (1.0 दिनों में एक विकल्प नहीं)।

बस जिज्ञासा से बाहर (स्वयं जावा डेवलपर नहीं): क्या इसमें final staticऔर के बीच अंतर है static final? यदि ऐसा है, तो ये क्या है?
मार्जन वेनेमा

1
@MarjanVenema कोई अंतर नहीं है, केवल संशोधकों का पसंदीदा क्रम। चेकस्टाइल संशोधक चेक पसंदीदा क्रम को दर्शाता है। जाहिरा तौर पर, जो कोई भी मैंने jdk संस्करण में उन दो स्रोत फ़ाइलों को लिखा है जो मैंने आदेश पर सहमत नहीं हुए हैं। इसका केवल सम्मेलन है।

:) और धन्यवाद माइकल, जवाब देने के लिए और लिंक के लिए समय निकालने के लिए।
मार्जन वेनेमा

5

असली कारण यह है कि यह एक विरासत का मुद्दा है। System.in,out,errस्थिरांक जावा 1.0 का हिस्सा है ... और शायद एक बहुत आगे वापस थे। जब तक यह स्पष्ट था कि डिजाइन में समस्याएं थीं, तब तक इसे ठीक करने में बहुत देर हो चुकी थी। सबसे अच्छा वे System.setIn,setOut,setErrजावा 1.1 में विधियों को जोड़ सकते थे और फिर भाषा विनिर्देश मुद्दों 1 से निपट सकते थे ।

यह इस मुद्दे के समान है कि एक स्थिर System.arraycopyविधि क्यों है जिसका नाम जावा नामकरण सम्मेलनों का उल्लंघन करता है।


जैसे कि यह "खराब डिज़ाइन" है या नहीं, मुझे लगता है कि यह है। ऐसी परिस्थितियां हैं जहां मौजूदा गैर-ओओ हैंडलिंग एक गंभीर समस्या है। (सोचो ... आप एक "मानक आईओ" स्ट्रीम आवश्यकताओं के संघर्ष के दौरान एक जावा प्रोग्राम को दूसरे के अंदर कैसे चला सकते हैं । सोचिए ... इकाई परीक्षण कोड जो धाराओं को बदलने पर जोर देता है।)

हालांकि, मैं इस तर्क से भी संबंधित हूं कि चीजों को करने का मौजूदा तरीका बहुत सारे मामलों में अधिक सुविधाजनक है।


1 - यह ध्यान रखना दिलचस्प है कि System.in,out,errचर को "विशेष शब्दार्थ" होने के नाते जेएलएस में विशेष उल्लेख मिलता है। जेएलएस का कहना है कि यदि आप किसी finalफ़ील्ड का मान बदलते हैं , तो व्यवहार अपरिभाषित है ... सिवाय इन फ़ील्ड के मामले में ।


2

मेरा मानना ​​है कि आउट ऑब्जेक्ट अपरिवर्तनीय है, जो इसे किसी सार्वजनिक अंतिम स्थिर क्षेत्र में रखे जाने के लिए सुरक्षित (यह बहस का विषय) है।

जेडीके में कई कक्षाएं सर्वश्रेष्ठ ऑब्जेक्ट-ओरिएंटेड डिज़ाइन सिद्धांतों का सम्मान नहीं करती हैं। इसका एक कारण यह है कि वे लगभग 20 साल पहले लिखे गए थे, जब ऑब्जेक्ट-ओरिएंटेशन केवल एक मुख्य प्रतिमान के रूप में उभर रहा था और कई प्रोग्रामर बस उनसे परिचित नहीं थे क्योंकि वे अब हैं। खराब एपीआई डिजाइन का एक बहुत अच्छा उदाहरण तारीख और समय एपीआई है, जिसे बदलने में उन्हें 19 साल लगे ...


3
मैं बयान को और भी अधिक मजबूत बना सकता हूं, एक सार्वजनिक अंतिम चर (स्थिर या नहीं) बिल्कुल एक गटर के रूप में "सुरक्षित" है और मैं एक सेटर / गेट्टर जोड़ी की अपरिहार्यता को रोकूंगा। सेटर्स हमेशा एक बुरे विचार के बारे में होते हैं (अपरिवर्तनीय अच्छा है - और अगर यह अपरिवर्तनीय विधि नहीं हो सकता है कि "सेट" यह शायद थोड़ा व्यापार तर्क भी योग्य है), यदि आपको एक गटर की आवश्यकता है तो आप इसे सार्वजनिक कर सकते हैं अंतिम, लेकिन न तो करना बेहतर है - यह डेटा के लिए एक वर्ग से मत पूछो, एक वर्ग से यह डेटा के लिए कुछ करने के लिए कहें।
बिल के

@ बेलक: हां, कानून के कानून के रूप में भी जाना जाता है (हालांकि यह एक कानून नहीं है, बल्कि एक दिशानिर्देश है)।
साल्स्के

2

यह उत्तर महान और सत्य है।

मैं जोड़ना चाहता था कि कुछ मामलों में प्रयोज्यता के लिए समझौता किया गया था।

स्ट्रिंग के प्रकार नई के बिना त्वरित किए जा सकते हैं, घटना जब स्ट्रिंग एक आदिम नहीं है:

String s = "Hello";

स्ट्रिंग एक गैर-आदिम होने के नाते, इस तरह तत्काल किया जाना चाहिए:

String s = new String("Hello");          // this also works 

लेकिन संकलक छोटे, कम ओओ विकल्प के लिए अनुमति देता है, क्योंकि स्ट्रिंग एपीआई में अब तक सबसे व्यापक रूप से उपयोग किया जाने वाला वर्ग है।

गैर-OO तरीके से भी सरणियों को आरंभ किया जा सकता है:

int i[] = {1,2,3};

पर्याप्त रूप से, एक वस्तु या तो एक वर्ग या एक सरणी का एक उदाहरण है । अर्थ सरणियाँ पूरी तरह से अलग प्रकार की कक्षा हैं।

एरे के पास एक lengthसार्वजनिक क्षेत्र है जो एक स्थिर नहीं है। इसके अलावा, क्लास एरे पर कोई डॉक्यूमेंटेशन नहीं है। (Arrays वर्ग या java.reflect.Array के साथ भ्रमित करने के लिए नहीं)।

int a = myArray.length;    // not length()

6
वे अलग-अलग चीजें हैं - new String("Hello")हमेशा एक नई स्ट्रिंग ऑब्जेक्ट बनाएंगे। जबकि String s = "Hello";नजरबंद वस्तु का उपयोग करेगा। तुलना करें: "Hello" == "Hello"यह सच हो सकता है, जबकि new String("Hello") == new String("Hello")हमेशा गलत होता है। पहले समय में हो रहा संकलन समय अनुकूलन जादू है जो इसके साथ संभव नहीं है new String("Hello")। देखें en.wikipedia.org/wiki/String_interning

@ मिचेल्ट I ने पूर्णता के लिए, सरणियों पर कुछ अतिरिक्त व्यापकता जोड़ी है।
ट्यूलेंस कोरडोवा

2
@ तारिक मैं इस बात पर आपत्ति कर रहा था कि "स्ट्रिंग एक गैर-आदिम होने के नाते, इस तरह से अस्थिर होना चाहिए: String s = new String("Hello");" जो गलत है। स्ट्रिंग इंटर्निंग के कारण छोटा विकल्प ( String s = "Hello";) अधिक सही है।

2
के साथ String, कोई "अधिक सही" विकल्प नहीं है। दोनों सही हैं। हालांकि, जैसा कि माइकलटी कहता है, स्ट्रिंग इंटर्निंग के कारण छोटे को पसंद किया जाता है।
एंड्रेस एफ।

1
@AndresF। मैंने "कम ओओ" के लिए "कम सही" बदल दिया।
ट्यूलेंस कोर्डोवा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.