Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重置系统输入/输出_Java_Final - Fatal编程技术网

Java 重置系统输入/输出

Java 重置系统输入/输出,java,final,Java,Final,如果System.out和System.in是最终的,这样我们就不会更改它们,那么为什么我们有方法System.setIn和System.setOut?下面的说法不矛盾吗 System.in和System.out是 无需访问器即可直接访问 方法。但它们不是直接的 可重定向到其他流,因为 它们是最终版本。但我们有塞特 方法将它们设置为其他类型 溪流 如果它们是最终的,为什么还要让它们重置?或者,如果我们需要它们能够重置为其他一些流,为什么要将它们放在首位?与其直接访问它们,为什么不让用户编写Sys

如果System.out和System.in是最终的,这样我们就不会更改它们,那么为什么我们有方法
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