System.out
dichiarato come public static final PrintStream out
.java: "final" System.out, System.in e System.err?
Ma è possibile chiamare System.setOut()
per riassegnarlo.
Huh? Com'è possibile se è final
?
(stesso punto vale per System.in
e System.err
)
E ancora più importante, se si può mutare i campi finali statici pubblici, che cosa significa questo per quanto riguarda le garanzie (se presenti) che final
ti dà? (Non ho mai capito né aspettato System.in/out/err comportava come final
variabili)
I campi finali non godono di molti vantaggi dalla JVM stessa, sebbene siano controllati rigorosamente dal verificatore. Ci sono modi per modificare anche i campi finali, ma non tramite il codice java standard (poiché è un oggetto del verificatore). È fatto tramite Unsafe ed esposto in java tramite Field.set (richiede true accessibile), che viene compilato per le cose non sicure menzionate. Anche JNI può farlo, quindi la JVM non è così appassionata nel tentativo di ottimizzare ... {forse avrei dovuto strutturare il commento come risposta ma meh} – bestsss