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

2022-09-04 07:00:31

有没有人对java.lang.System.out的尴尬设计背后的动机有所了解?

尴尬:
首先,out成员暴露了(封装有人吗?
其次,它是最终的,但可以通过setOut()进行更改(与最终版本相矛盾)。


答案 1

在Java 1.0.x中,朋友不是 - 可以通过直接分配给他们来更改它们。但是,当 Sun 决定在 Java 1.1 中选择性地限制此行为时,这带来了一个问题(当时对于小程序)。为了保持至少一些向后兼容性,最终使用本机方法写入,该方法使用适当的安全检查进行包装。System.outfinalout


答案 2

我敢打赌,它主要是为了简洁起见而曝光的。比较:

System.out.prinln("blah");

System.getOut().println("blah");

前者不是很多字符更短,但仍然更短,概念上更简单。它也很可能更快,也许特别是在JIT在Java虚拟机中不太常见的时代;我敢打赌,在这些情况下,直接访问比方法调用更快。因此,它归结为一种权衡。

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

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


推荐