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

时间:2009-04-07 11:51:17

标签: java api

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

重击:
首先,公开 out 成员(封装任何人?) 其次,它是最终,但可以通过 setOut()进行更改(与final相矛盾)。

3 个答案:

答案 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虚拟机中不常见的那一天;我敢打赌,在这些情况下,直接访问比方法调用更快。所以,归结为权衡。

<强>更新
对于finalsetOut()documentation for the latter表示如果有安全管理器,则会查询是否允许调用者重新设置输出流。这可能就是答案;如果out成员可以直接分配,那么就没有办法保护它。

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

答案 2 :(得分:2)

这与Array.length vs List.size()有相似之处。

出于历史原因可以吗?还有其他类似的语言吗?