I would bet it is exposed mainly for brevity. Compare:
System.out.prinln("blah");
with
System.getOut().println("blah");
The former is not many character shorter, but still it is shorter, and simpler conceptually. It is also very probably faster, perhaps especially back in the day when JIT was not too common in Java virtual machines; I bet the direct access is faster than a method call in those cases. So, it boils down to being a tradeoff.
UPDATE:
As for final
and setOut()
, the documentation for the latter says that if there is a security manager, it will be queried to see if the caller is allowed to re-set the output stream. This might be the answer; if the out
member had been directly assignable, there would not have been a way to protect it.
This is just my interpretation of the API and the thoughts that might be behind its design, I could be off.