2011-02-13 68 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方法稍後添加。