जवाब "है क्योंकि एक स्कैनर राज्य है।"
Java.util.Scanner के कोड को देखते हुए, आपको कई निजी फ़ील्ड जैसे बफर और उससे संबंधित जानकारी, एक माचिस, एक पैटर्न, एक इनपुट स्रोत, स्रोत बंद है या नहीं, इस बारे में जानकारी दिखाई देगी, प्रकार अंतिम चीज़ का मिलान, जानकारी के बारे में कि क्या अंतिम चीज़ एक वैध मिलान थी या नहीं, संख्याओं के लिए उपयोग किए जाने वाले मूलांक, लोकेल ( हाल ही में उपयोग किए गए पैटर्नों के लिए .
या आप ,
हजारों विभाजक के रूप में उपयोग कर रहे हैं) के बारे में जानकारी , और इसका अपना LRU कैश पिछले अपवाद के बारे में जानकारी, सामना करना पड़ा, पार्सिंग नंबरों के बारे में कुछ जानकारी, पार्सलिंग बूलियन्स के बारे में कुछ जानकारी, पूर्णांक पूर्णांक के बारे में थोड़ी अधिक जानकारी ... और मुझे लगता है कि इसके बारे में विचार करें।
जैसा कि आप देख सकते हैं, वहाँ पाठ का एक बड़ा ब्लॉक है। यह स्कैनर की स्थिति है। स्कैनर को एक स्थिर वर्ग में बनाने के लिए, उस स्थिति को कहीं और संग्रहीत करने की आवश्यकता होगी। यह करने का सी तरीका वास्तव में इसके साथ इतना अधिक नहीं है। आपको ए fscanf
। FILE उस स्थिति के बारे में कुछ स्थिति बनाए रखता है, जो उस स्थिति में है (लेकिन प्रत्येक आह्वान के लिए इसे पारित करने की आवश्यकता है fscanf
)। यदि कोई त्रुटि थी, तो आपको इसे संसाधित करना होगा (और फिर आप ऐसा कोड लिखना शुरू करते हैं जो इस तरह दिखता है ) - और यह आपको ऐसी जानकारी नहीं बताता है जैसे "मैं एक इंटीजर की उम्मीद कर रहा था, लेकिन एक स्ट्रिंग पाया।"
जब कोई सैद्धांतिक रूप से स्थिर स्कैनर को देखता है - राज्य के सभी वर्ग के बाहर बनाए रखा जाता है, तो यह कक्षा के भीतर समझाया नहीं जाता है। कोड के अन्य बिट उन चर के साथ टिंकर कर सकते हैं। जब अन्य कोड कक्षा की स्थिति के साथ छेड़छाड़ कर सकता है, तो यह इस कारण से करना बहुत मुश्किल हो जाता है कि किसी भी स्थिति में कक्षा क्या करेगी।
हो सकता है, आप कुछ ऐसा लिख सकते हैं ScannerState { Locale loc; ... }
और इसमें कोड हो सकते हैं:
ScannerState state = new ScannerState(a whole lot of arguments);
int foo = Scanner.nextInt(state);
लेकिन फिर, यह राज्य को एक स्कैनर ऑब्जेक्ट के भीतर पहली जगह में (और राज्य में पारित करने की आवश्यकता नहीं है) की तुलना में अधिक बोझिल है।
अंत में, स्कैनर इंटरफ़ेस को लागू करता है Iterator<String>
जिसका अर्थ है कि कोई इसका उपयोग कोड में कर सकता है जैसे:
Scanner in = new Scanner(someFile);
whie(in.hasNext()) { ... }
स्कैनर वर्ग का एक उदाहरण प्राप्त करने में सक्षम होने के बिना, इस प्रकार की संरचना एक वस्तु उन्मुख भाषा के भीतर अधिक बोझिल हो जाती है।