为什么System.out的设计很尴尬?

Shi*_*iel 12 java api

有没有人知道java.lang.System.out笨拙设计背后的动机?

尴尬:
首先,外面的成员暴露(封装任何人?).
其次,它是最终的,但可以通过setOut()更改(与final相矛盾).

Nic*_*ley 19

在Java 1.0.x中System.out,朋友们没有final-it可以通过直接分配给他们来改变它们.但是,当Sun决定在Java 1.1(对于applet,当时)中可选地限制此行为时,这就出现了问题.为了保持至少一些向后兼容性,out最终并使用本机方法写入,该方法包含适当的安全检查.

  • 对于新的Java内存模型,System.in/out/err必须有一个特定的例外. (2认同)

unw*_*ind 9

我敢打赌,这主要是为了简洁.相比:

System.out.prinln("blah");
Run Code Online (Sandbox Code Playgroud)

System.getOut().println("blah");
Run Code Online (Sandbox Code Playgroud)

前者是没有多少字符短,但它仍然短,更简单的概念.它也可能更快,尤其是在JIT在Java虚拟机中不常见的那一天; 我敢打赌,在这些情况下,直接访问比方法调用更快.所以,归结为权衡.

更新:
至于finalsetOut(),后者文档说如果有安全管理器,将查询是否允许调用者重新设置输出流.这可能就是答案; 如果该out成员可以直接转让,那么就没有办法保护它.

这只是我对API及其设计背后的想法的解释,我可能会离开.