2016-04-25 43 views
4

我知道的至少2個機制來強制執行集合不應修改:Java在編譯時允許不變性檢查嗎?

不過,我注意到兩個他們通過拋出異常(例如UnsupportedOperationException)在運行時執行合同。

問題:

  1. 是否有現有的庫/語言功能,允許在編譯時來執行不變性檢查?
  2. 如果不是,爲什麼不呢?是因爲語言限制,設計決定的結果還是其他原因?

回答

2

Collections API的原始作者(不幸)沒有區分不可變和可變集合。不可變的API不會有變異方法(但可能會在Persistent data structure內部重建集合)。

請參閱Scala作爲支持不可變和可變集合的JVM上的Collections API的示例。

+2

值得明確呼籲http://docs.oracle.com/javase/1.5.0/docs/guide/collections/designfaq.html#1他們討論這一點。 (Tl; dr:他們試過並放棄了。) –

+0

這個答案解決了我的兩個問題。 – maditya

2

你只能通過在類上沒有變異方法來做到這一點。但是如果你想實現一個具有變異語義的方法的現有接口(即使在一般情況下靜態分析不能幫助你),你也會陷入困境。