2011-02-13 89 views
4

如果System.out和System.in是最终的,以便我们不改变它们,那么为什么我们有方法System.setInSystem.setOut?下面的说法不是矛盾的吗?重置System.in/out

System.inSystem.out是 的情况下直接访问 方法访问。但他们不直接 可重定向到其他流,因为 他们是final。但我们确实设置了 方法将它们设置为其他一些 流。

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

回答

3

你基本上是在研究Java早期的设计瑕疵。这些字段存在于Java 1.0中(大概已经是公开的和最终的),当设计者意识到他们需要重定向它们的方法时,改变已经太迟了,因为这会破坏现存的每一个Java程序。

Java的设计总是重视兼容性高于一切,所以在Java 1.1中,他们将set方法作为替代方法添加为解决方法(使字段非最终会使设计缺陷变得更糟,至少以这种方式设置方法可以例如做一个权限检查)。

0

我在过去交换进出出错类时没有问题。这在我测试命令行类的某些情况下很有用。我不记得我是使用set *()方法还是直接设置流。但这很容易做到。

+1

您使用了`set *`方法。这些字段被声明为“final”。 – 2011-02-14 00:45:43

1

setXXX方法正在使用一些VM内部的魔法来做一些通常不可能的事情,即改变最终变量。 (这将有可能没有这样的魔力,如果最终流只有周围的真实流包装,私下多变wrapees。)这种设计的

优势相比,简单的非最终字段:

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

相比于简单get + set方法(和私人领域):

  • 它是短写。
  • 更重要的是,正如Michael所说:与旧代码兼容。 setXXX方法稍后添加。