Jawabannya adalah "karena pemindai memiliki status."
Melihat kode untuk java.util.Scanner , Anda akan melihat sejumlah bidang pribadi seperti buffer dan informasi terkait, Pencocokan, Pola, sumber input, informasi tentang apakah sumber ditutup atau tidak, jenisnya dari hal terakhir yang cocok, informasi tentang apakah hal terakhir cocok atau tidak, radix digunakan untuk angka, lokal (informasi tentang apakah Anda menggunakan .
atau ,
sebagai pemisah ribuan), dan cache LRU sendiri untuk pola yang baru saja digunakan , informasi tentang pengecualian terakhir yang ditemukan, beberapa informasi tentang parsing number, beberapa informasi tentang parsing boolean, sedikit lebih banyak informasi tentang parsing bilangan bulat ... dan saya pikir itu saja.
Seperti yang Anda lihat, itu blok teks yang cukup besar di sana. Itulah keadaan Pemindai. Untuk membuat Scanner menjadi kelas statis, keadaan itu perlu disimpan di tempat lain. Cara C melakukannya benar-benar tidak memiliki banyak keadaan dengan itu. Anda punya fscanf
. FILE mempertahankan beberapa status tentang posisi pada saat itu (tetapi itu harus dilewati untuk setiap pemanggilan fscanf
). Jika ada kesalahan, Anda harus memprosesnya (dan kemudian Anda mulai menulis kode yang terlihat seperti ini ) - dan itu tidak memberi tahu Anda informasi seperti "Saya mengharapkan Integer, tetapi menemukan sebuah String."
Ketika seseorang melihat pada Pemindai statis statis - semua keadaan dipertahankan di luar kelas, itu tidak dienkapsulasi di dalam kelas. Bit kode lain dapat bermain-main dengan variabel-variabel itu. Ketika kode lain dapat bermain-main dengan keadaan kelas, menjadi sangat sulit untuk berpikir tentang apa yang akan dilakukan kelas dalam situasi apa pun.
Anda dapat, mungkin, menulis sesuatu seperti ScannerState { Locale loc; ... }
dan memiliki kode yang menghasilkan:
ScannerState state = new ScannerState(a whole lot of arguments);
int foo = Scanner.nextInt(state);
Tapi kemudian, ini jauh lebih rumit daripada memiliki negara dienkapsulasi dalam objek Scanner di tempat pertama (dan tidak perlu lewat di negara).
Terakhir, Scanner mengimplementasikan antarmuka Iterator<String>
yang artinya seseorang dapat menggunakannya dalam kode seperti:
Scanner in = new Scanner(someFile);
whie(in.hasNext()) { ... }
Tanpa bisa mendapatkan instance kelas Scanner, jenis struktur ini menjadi lebih rumit dalam bahasa berorientasi objek.