Probablemente porque ampliarlo y sobrescribir algunos de sus métodos probablemente lo rompa. Y hacer que sea más fácil sobrescribir los métodos expondría a gran parte del funcionamiento interno, por lo que si en el futuro deciden cambiarlos (por rendimiento u otras razones), sería más difícil para ellos cambiar la clase sin romper todas las clases que lo extienden
Por ejemplo, consideremos el siguiente método en la clase:
public boolean nextBoolean() {
clearCaches();
return Boolean.parseBoolean(next(boolPattern()));
}
decir que quiere sobrescribir esto porque quiere hacer 'impresionante' evaluar a un valor lógico 'verdadero' (por cualquier motivo). Si lo sobreescribe, no puede llamar a super.nextBoolean(), ya que eso consumiría el siguiente token usando la lógica predeterminada. Pero si no llama a super.nextBoolean(), no se invocará clearCaches(), posiblemente rompiendo los otros métodos no sobrescritos. No puedes llamar a clearCaches() porque es privado. Si lo protegieron, pero luego se dieron cuenta de que estaba causando un problema de rendimiento, y querían una nueva implementación que ya no borrara los cachés, entonces podrían romper su implementación sobreescrita, lo que aún llamaría eso.
Básicamente es para que puedan cambiar fácilmente las partes ocultas dentro de la clase, que son bastante complejas, y lo protegen de hacer una clase secundaria rota (o una clase que podría romperse fácilmente).
Si esto está relacionado con el rendimiento, ¿sería posible en teoría hacer un escáner que no funciona y que sea extensible? Mi lógica dice que debería ser? – Roalt