除了记录它(显然它也应该被记录),使用特殊的返回类型(我担心将自己限制为ImmutableX)或让用户在运行时发现,是否有任何其他方式告诉API用户他们从所述API收到的集合是不可修改/不可变的?
是否有任何命名约定或标记注释通用信号相同?
编辑:不可修改和不可变并不意味着相同的事情,但出于这个问题的目的,它们足够相似。这个问题基本上归结为让用户知道返回的对象没有完全遵守它的契约(即一些常见的操作会引发运行时异常)。
答案 0 :(得分:2)
不是一般的命名约定,但您可能对使用此@Immutable
注释感兴趣:http://aspects.jcabi.com/annotation-immutable.html
除了文档目的,这个机制还将验证你的对象是否真的是不可变的(在它实例化期间),如果不是,则抛出运行时异常。
答案 1 :(得分:1)
答案 2 :(得分:1)
好的和详细的解决方案是创建自己的UnmodifiableCollection包装类,并将其返回:
public UnmodifiableCollection giveMeSomeUnmodifableCollection() {
return new UnmodifiableCollection(new LinkedList());
}
返回类型的名称足以对该集合的不可修改性进行详细说明。
答案 3 :(得分:1)
在方法的返回类型上编写@Immutable
注释是最好的方法。它有多种好处:
此外,验证可以在编译时进行,也可以在运行代码之前进行。
如果您想在编译时进行验证,可以使用IGJ Immutability Checker。它区分
@Immutable
引用的抽象值永远不会改变,和
@ReadOnly
提及无法进行哪些副作用。