如果System.out和System.in是最终的,以便我们不更改它们,那么为什么我们有方法System.setIn
和System.setOut
?以下陈述不矛盾吗?
System.in
和System.out
是 无需访问者即可直接访问 方法。但他们不是直接的 可重定向到其他流因为 他们是final
。但我们确实有制定者 将它们设置为其他方法的方法 流。
如果他们是final
,为什么要让他们重置?或者,如果我们需要它们能够重置为其他流,为什么首先将它们final
?而不是直接访问它们,为什么不让用户写System.getIn()
和System.getOut()
?
答案 0 :(得分:3)
你基本上是在看Java早期遗留下来的设计疣。这些字段存在于Java 1.0中(可能已经公开和最终),当设计人员意识到他们需要一种方法来重定向它时,改变已经太晚了,因为这会破坏现有的每一个Java程序。
Java的设计始终重视向下兼容性,因此在Java 1.1中,他们将set方法添加为变通方法(使得非最终字段只会使设计缺陷变得更糟,至少这样设置方法可以例如,进行权限检查)。
答案 1 :(得分:1)
setXXX
方法正在使用一些VM内部魔法来做一些通常不可能的事情,即更改最终变量。 (如果没有这样的魔法,如果最后的Streams只是真正的溪流周围的包装,可以使用私人可更换的燧石。)
与简单的非最终字段相比,此设计的优点:
与简单的get
+ set
方法(和私有字段)相比:
setXXX
方法。答案 2 :(得分:0)
我过去没有问题,因为in,out和err在课堂上进行交换。在我测试命令行类的某些情况下,它很有用。我不记得我是否使用了set *()方法或者只是直接设置了流。但这很容易做到。