Java 指示API返回不可修改/不可变集合的方法
除了记录它(显然它也应该被记录)、使用特殊的返回类型(我担心将自己限制为不可变的X)或让用户在运行时发现之外,还有其他方法告诉API用户他们从所述API收到的集合是不可修改/不可变的吗 是否有任何命名约定或标记注释普遍表示相同的事情 编辑:不可修改和不可修改并不意味着相同的事情,但就本问题而言,它们非常相似。问题基本上归结为让用户知道返回的对象没有完全遵守其约定(即,一些常见操作将抛出运行时异常)Java 指示API返回不可修改/不可变集合的方法,java,immutability,Java,Immutability,除了记录它(显然它也应该被记录)、使用特殊的返回类型(我担心将自己限制为不可变的X)或让用户在运行时发现之外,还有其他方法告诉API用户他们从所述API收到的集合是不可修改/不可变的吗 是否有任何命名约定或标记注释普遍表示相同的事情 编辑:不可修改和不可修改并不意味着相同的事情,但就本问题而言,它们非常相似。问题基本上归结为让用户知道返回的对象没有完全遵守其约定(即,一些常见操作将抛出运行时异常) 确实要记录下来 提供用于检查给定对象是否为imutable集合的API 返回包装中包含信息的集合,
不是通用的命名约定,但您可能有兴趣使用此
@Immutable
注释:
除了文档目的之外,此机制还将验证对象是否真的不可变(在实例化过程中),如果不可变,则引发运行时异常。好的详细解决方案是创建自己的不可修改集合包装类,并返回它:
public UnmodifiableCollection giveMeSomeUnmodifableCollection() {
return new UnmodifiableCollection(new LinkedList());
}
返回类型的名称足以详细说明集合的不可修改性。在方法的返回类型上编写
@Immutable
注释是最好的方法。它有多重好处:
- 注释记录了用户的含义
- 工具可以验证客户端代码是否尊重注释(即,客户端代码没有bug)
- 工具可以验证库代码是否尊重注释(即库代码没有bug)
无法执行副作用的引用。在Java中,“不可修改”和“不可变”可能意味着不同的东西<代码>集合。例如,不可修改列表返回一个不可修改但不是不可变的列表对象-您不能对其调用
add
或remove
或set
,但其内容可以通过其他方式更改。@immibis,我知道,但感谢您指出这一点。我用一个简短的解释修正了这个问题。对于你的第三点,我假设一些带有getX和isMutable方法的包装器比返回一个ImmutableX的好处在于getX可以返回一个本机集合接口。你能详细说明吗?明确地说,这样就没有必要重新发明轮子,提供特殊用途的收藏品。另一个好处是灵活性。如果将来你问起如何向API用户通知你的集合的其他元数据,你就会知道该怎么做:)不可变和不可修改之间有区别-wrapper将清除这一点。我对第三个选项持怀疑态度。一方面,它确实完成了所请求的内容,另一方面,它添加了一个稍微复杂的抽象层,并迫使程序员处理业务逻辑中本质上的错误(即,如果是可变的,则添加元素,否则..什么?在这两种情况下,一个新的、显式可变/可修改的集合会更好).这是我的第四个解决方案-将结果统一到相同类型的集合中。最简单,但在您的情况下可能吗?这取决于您自己,在被广泛采用的google findbugs maven工件中,不可变。