Cevap "çünkü bir tarayıcı durumu vardır."
Java.util.Scanner koduna baktığınızda, bir tampon ve onunla ilişkili bilgiler, bir Eşleştirici, bir Desen, bir giriş kaynağı, kaynağın kapalı olup olmadığı hakkında bilgi, tür gibi bir dizi özel alan göreceksiniz. eşleşen son şey, son şeyin geçerli bir eşleşme olup olmadığı hakkında bilgi, sayılar için kullanılan sayı tabanı, yerel ayar ( bin ayırıcı kullanıp kullanmadığınız .veya ,binlik ayırıcı olarak kullanıp kullanmadığınız hakkında bilgi ) ve son kullanılan kalıplar için kendi LRU önbelleği , karşılaşılan son istisna hakkında bilgi, sayıları ayrıştırma hakkında bazı bilgiler, booleans ayrıştırma hakkında bazı bilgiler, tamsayıları ayrıştırma hakkında biraz daha fazla bilgi ... ve bence bu konuda.
Gördüğünüz gibi, bu oldukça büyük bir metin bloğu. Tarayıcının durumu budur. Tarayıcıyı statik bir sınıfa dönüştürmek için bu durumun başka bir yerde saklanması gerekir. Bunu yapmanın C şekli gerçekten onunla o kadar da fazla bir duruma sahip değil. Bir tane var fscanf. DOSYA, bulunduğu konum hakkında bir durum korur (ancak her çağrılması için aktarılması gerekir fscanf). Bir hata varsa, bunu işlemek zorunda (ve sonra gibi görünüyor o kod yazmaya başlamadan bu ) - ve bu size gibi bilgileri söylemez "Ben bir Tamsayı bekliyordum, ama bir dize buldum."
Teorik olarak statik Tarayıcıya bakıldığında - tüm durum sınıfın dışında tutulur, sınıf içinde kapsüllenmez. Diğer kod parçaları bu değişkenlerle uğraşabilir. Diğer kod sınıfın durumunu değiştirebilirse, sınıfın herhangi bir durumda ne yapacağını düşünmek çok zorlaşır.
Belki şöyle bir şey yazabilir ScannerState { Locale loc; ... }ve sonuç veren bir koda sahip olabilirsiniz:
ScannerState state = new ScannerState(a whole lot of arguments);
int foo = Scanner.nextInt(state);
Ama sonra, bu durum ilk etapta bir Tarayıcı nesnesi içinde kapsüllenmiş durumdan (ve eyaletten geçmesine gerek kalmadan) çok daha hantaldır.
Son olarak, Tarayıcı arabirimi uygular, Iterator<String>bu da kişinin aşağıdaki gibi kodda kullanabileceği anlamına gelir:
Scanner in = new Scanner(someFile);
whie(in.hasNext()) { ... }
Scanner sınıfının bir örneğini alamadan, bu tür yapı nesneye yönelik bir dilde daha hantal hale gelir.