有没有人知道java.lang.System.out笨拙设计背后的动机?
重击:
首先,公开 out 成员(封装任何人?)
其次,它是最终,但可以通过 setOut()进行更改(与final相矛盾)。
答案 0 :(得分:19)
在Java 1.0.x System.out
中,朋友不是final
- 可以通过直接分配给他们来更改它们。但是,当Sun决定在Java 1.1(对于applet,当时)中可选地限制此行为时,这就出现了问题。为了保持至少一些向后兼容性,out
是最终的,并使用本机方法写入,该方法包含适当的安全检查。
答案 1 :(得分:9)
我敢打赌,这主要是为了简洁。比较:
System.out.prinln("blah");
与
System.getOut().println("blah");
前者不是很短的字符,但它 更短,并且在概念上更简单。它也可能更快,尤其是在JIT在Java虚拟机中不常见的那一天;我敢打赌,在这些情况下,直接访问比方法调用更快。所以,归结为权衡。
<强>更新强>
对于final
和setOut()
,documentation for the latter表示如果有安全管理器,则会查询是否允许调用者重新设置输出流。这可能就是答案;如果out
成员可以直接分配,那么就没有办法保护它。
这只是我对API及其设计背后可能存在的想法的解释,我可能会离开。
答案 2 :(得分:2)
这与Array.length
vs List.size()
有相似之处。
出于历史原因可以吗?还有其他类似的语言吗?