Java允许在编译时进行不变性检查吗?

Java允许在编译时进行不变性检查吗?,java,exception,Java,Exception,我知道至少有两种机制可以强制执行不应修改集合: Java的不可修改集合: 番石榴的不变系列: 但是,我注意到它们都通过抛出异常(例如UnsupportedOperationException)在运行时强制执行契约 问题: 是否存在允许在编译时执行不变性检查的现有库/语言功能 若否,原因为何?是因为语言限制、设计决策的结果还是其他原因 只有在类上没有变异方法才能做到这一点。但是,如果您想要实现一个现有接口,该接口包含具有变异语义的方法(在一般情况下,即使是静态分析也帮不了您)。集合API的原始

我知道至少有两种机制可以强制执行不应修改集合:

  • Java的不可修改集合:
  • 番石榴的不变系列:
但是,我注意到它们都通过抛出异常(例如UnsupportedOperationException)在运行时强制执行契约

问题:

  • 是否存在允许在编译时执行不变性检查的现有库/语言功能
  • 若否,原因为何?是因为语言限制、设计决策的结果还是其他原因

  • 只有在类上没有变异方法才能做到这一点。但是,如果您想要实现一个现有接口,该接口包含具有变异语义的方法(在一般情况下,即使是静态分析也帮不了您)。

    集合API的原始作者(不幸的是)没有区分不可变集合和可变集合。一个不可变的API不会有变异的方法(但可能会在内部重新构建集合)


    请参见JVM上支持不可变集合和可变集合的集合API示例。

    值得在讨论此问题的地方明确指出。(Tl;dr:他们尝试了,但放弃了。)这个答案回答了我的两个问题。