Java 重置系统输入/输出
如果System.out和System.in是最终的,这样我们就不会更改它们,那么为什么我们有方法Java 重置系统输入/输出,java,final,Java,Final,如果System.out和System.in是最终的,这样我们就不会更改它们,那么为什么我们有方法System.setIn和System.setOut?下面的说法不矛盾吗 System.in和System.out是 无需访问器即可直接访问 方法。但它们不是直接的 可重定向到其他流,因为 它们是最终版本。但我们有塞特 方法将它们设置为其他类型 溪流 如果它们是最终的,为什么还要让它们重置?或者,如果我们需要它们能够重置为其他一些流,为什么要将它们放在首位?与其直接访问它们,为什么不让用户编写Sys
System.setIn
和System.setOut
?下面的说法不矛盾吗
System.in
和System.out
是
无需访问器即可直接访问
方法。但它们不是直接的
可重定向到其他流,因为
它们是最终版本
。但我们有塞特
方法将它们设置为其他类型
溪流
如果它们是最终的,为什么还要让它们重置?或者,如果我们需要它们能够重置为其他一些流,为什么要将它们放在首位?与其直接访问它们,为什么不让用户编写
System.getIn()
和System.getOut()
?您基本上看到了Java早期遗留下来的设计缺陷。这些字段存在于Java1.0中(可能已经是公共的和最终的),当设计人员意识到他们需要一种重定向它们的方法时,更改已经太晚了,因为这将破坏现有的几乎每一个Java程序
Java的设计总是将向下兼容性放在首位,因此在Java 1.1中,他们添加了set方法作为变通方法(使字段非final只会使设计缺陷更加严重,至少这样set方法可以进行权限检查)。我过去在类中交换in,出了差错。在我测试命令行类的某些情况下,它非常有用。我不记得是使用set*()方法还是直接设置流。但是这很容易做到。setXXX方法使用一些VM内部魔法来完成通常不可能完成的事情,即更改最终变量。(如果最终的溪流只是真实溪流周围的包装纸,而且包装纸可以私下更换,那么没有这种魔力是可能的。) 与简单的非最终字段相比,此设计的优势:
- 这些方法可以要求安装的SecurityManager检查调用方是否具有更改流所需的权限
get
+set
方法(和私有字段)相比:
- 写起来比较短
- 更重要的是,正如Michael所说:与旧代码的兼容性。后来添加了
方法setXXX
set*
方法。这些字段被声明为final
。