簡體   English   中英

重置System.in/out

[英]Resetting System.in/out

如果System.out和System.in是最終的,以便我們不更改它們,那么為什么我們有方法System.setInSystem.setOut 以下陳述不矛盾嗎?

System.inSystem.out可以直接訪問,無需訪問器方法。 但它們不能直接重定向到其他流,因為它們是final 但我們確實有setter方法將它們設置為其他一些流。

如果他們是final為什么甚至讓他們重置? 或者,如果我們需要它們能夠重置為其他一些流,為什么首先將它們放在final 而不是直接訪問它們為什么不讓用戶編寫System.getIn()System.getOut()

你基本上是在看Java早期遺留下來的設計疣。 這些字段存在於Java 1.0中(可能已經是公共的和最終的),當設計人員意識到他們需要一種方法來重定向它們時,改變已經太晚了,因為這會破壞現有的每一個Java程序。

Java的設計始終重視向下兼容性,所以在Java 1.1中,他們將set方法添加為變通方法(使得非最終字段只會使設計缺陷變得更糟,至少這樣設置方法可以例如做一個權限檢查)。

setXXX方法正在使用一些VM內部魔術來做一些通常不可能的事情,即改變最終變量。 (如果沒有這樣的魔法,如果最終的Streams只是真正的溪流周圍的包裝,可以使用私人可更換的燧石。)

與簡單的非最終字段相比,此設計的優點:

  • 這些方法可以要求安裝的SecurityManager檢查調用者是否具有更改流的必要權限。

與簡單的get + set方法(和私有字段)相比:

  • 寫的時間更短。
  • 更重要的是,邁克爾說:兼容舊代碼。 稍后添加了setXXX方法。

我過去沒有問題,因為in,out和err在課堂上進行交換。 在我測試命令行類的某些情況下,它很有用。 我不記得我是否使用了set *()方法或者只是直接設置了流。 但這很容易做到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM