System.out
se declara como public static final PrintStream out
.java: "final" System.out, System.in y System.err?
Pero puede llamar al System.setOut()
para reasignarlo.
¿Huh? ¿Cómo es esto posible si es final
?
(mismo punto se aplica a System.in
y System.err
)
Y lo más importante, si se puede mutar los campos public static final, ¿qué significa esto en cuanto a las garantías (si los hay) que final
le da? (Nunca me di cuenta ni esperaba System.in/out/err comportó como variables de final
)
Los campos finales no disfrutan de muchos beneficios por parte de la propia JVM, aunque el verificador los controla estrictamente. También hay formas de modificar los campos finales pero no a través del código java estándar (ya que es un tema del verificador). Se realiza a través de Inseguro y expuesto en java a través de Field.set (se necesita acceso verdadero), que se compila con lo mencionado inseguro. También JNI puede hacerlo, por lo tanto, la JVM no está tan interesada en intentar optimizar ... {quizás debería haber estructurado el comentario como una respuesta, pero meh} – bestsss