উত্তরটি "কারণ কোনও স্ক্যানারের স্টেট রয়েছে।"
জাভা.ইটিল.স্ক্যানারের কোডের দিকে তাকিয়ে আপনি একাধিক প্রাইভেট ফিল্ড দেখতে পাবেন যেমন বাফার এবং এর সাথে সম্পর্কিত তথ্য, একটি ম্যাচার, একটি প্যাটার্ন, একটি ইনপুট উত্স, উত্সটি বন্ধ আছে কিনা সে সম্পর্কিত তথ্য, প্রকার শেষেরটির সাথে মিলেছে, সর্বশেষ জিনিসটি একটি বৈধ মিল ছিল কিনা সে সম্পর্কিত তথ্য, সংখ্যার জন্য ব্যবহৃত রেডিক্স, লোকেল (আপনি ব্যবহার করছেন .
বা ,
কয়েক হাজার বিভাজক হিসাবে তথ্য ) এবং সম্প্রতি ব্যবহৃত ব্যবহৃত নিদর্শনগুলির জন্য নিজস্ব এলআরইউ ক্যাশে , সর্বশেষ ব্যতিক্রমের মুখোমুখি হওয়া তথ্যগুলি, সংখ্যার পার্সিং সম্পর্কিত কিছু তথ্য, বুলিয়ান পার্সিং সম্পর্কিত কিছু তথ্য, পূর্ণসংখ্যা পার্সিং সম্পর্কিত বেশ খানিকটা তথ্য ... এবং আমি মনে করি এটি সম্পর্কে ব্যয় হয়।
আপনি দেখতে পাচ্ছেন, সেখানে পাঠ্যের মোটামুটি বড় ব্লক রয়েছে। এটি স্ক্যানারের অবস্থা। স্ক্যানারকে একটি স্ট্যাটিক শ্রেণিতে পরিণত করার জন্য, সেই রাজ্যের অন্য কোথাও সংরক্ষণ করা দরকার। এটি করার সি উপায়টির সাথে এর সাথে এতটা রাজ্য নেই। আপনি একটি পেয়েছেন fscanf
। ফাইলটি যে অবস্থানে রয়েছে সে সম্পর্কে কিছু স্থিতি বজায় রেখেছে (তবে প্রতিটি অনুরোধের জন্য এটি পাস করা দরকার 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()) { ... }
স্ক্যানার ক্লাসের উদাহরণ না পেয়ে, এই ধরণের কাঠামো কোনও অবজেক্ট ওরিয়েন্টেড ভাষার ভিতরে আরও জটিল হয়ে ওঠে।