2016-04-25 40 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

你只能通过在类上没有变异方法来做到这一点。但是如果你想实现一个具有变异语义的方法的现有接口(即使在一般情况下静态分析不能帮助你),你也会陷入困境。