重置System.in/out

时间:2011-02-13 22:30:24

标签: java final

如果System.out和System.in是最终的,以便我们不更改它们,那么为什么我们有方法System.setInSystem.setOut?以下陈述不矛盾吗?

  

System.inSystem.out是   无需访问者即可直接访问   方法。但他们不是直接的   可重定向到其他流因为   他们是final。但我们确实有制定者   将它们设置为其他方法的方法   流。

如果他们是final,为什么要让他们重置?或者,如果我们需要它们能够重置为其他流,为什么首先将它们final?而不是直接访问它们,为什么不让用户写System.getIn()System.getOut()

3 个答案:

答案 0 :(得分:3)

你基本上是在看Java早期遗留下来的设计疣。这些字段存在于Java 1.0中(可能已经公开和最终),当设计人员意识到他们需要一种方法来重定向它时,改变已经太晚了,因为这会破坏现有的每一个Java程序。

Java的设计始终重视向下兼容性,因此在Java 1.1中,他们将set方法添加为变通方法(使得非最终字段只会使设计缺陷变得更糟,至少这样设置方法可以例如,进行权限检查)。

答案 1 :(得分:1)

setXXX方法正在使用一些VM内部魔法来做一些通常不可能的事情,即更改最终变量。 (如果没有这样的魔法,如果最后的Streams只是真正的溪流周围的包装,可以使用私人可更换的燧石。)

与简单的非最终字段相比,此设计的优点:

  • 这些方法可以要求安装的SecurityManager检查调用者是否具有更改流的必要权限。

与简单的get + set方法(和私有字段)相比:

  • 写的时间更短。
  • 更重要的是,迈克尔说:兼容旧代码。后来添加了setXXX方法。

答案 2 :(得分:0)

我过去没有问题,因为in,out和err在课堂上进行交换。在我测试命令行类的某些情况下,它很有用。我不记得我是否使用了set *()方法或者只是直接设置了流。但这很容易做到。