Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 指示API返回不可修改/不可变集合的方法_Java_Immutability - Fatal编程技术网

Java 指示API返回不可修改/不可变集合的方法

Java 指示API返回不可修改/不可变集合的方法,java,immutability,Java,Immutability,除了记录它(显然它也应该被记录)、使用特殊的返回类型(我担心将自己限制为不可变的X)或让用户在运行时发现之外,还有其他方法告诉API用户他们从所述API收到的集合是不可修改/不可变的吗 是否有任何命名约定或标记注释普遍表示相同的事情 编辑:不可修改和不可修改并不意味着相同的事情,但就本问题而言,它们非常相似。问题基本上归结为让用户知道返回的对象没有完全遵守其约定(即,一些常见操作将抛出运行时异常) 确实要记录下来 提供用于检查给定对象是否为imutable集合的API 返回包装中包含信息的集合,

除了记录它(显然它也应该被记录)、使用特殊的返回类型(我担心将自己限制为不可变的X)或让用户在运行时发现之外,还有其他方法告诉API用户他们从所述API收到的集合是不可修改/不可变的吗

是否有任何命名约定或标记注释普遍表示相同的事情

编辑:不可修改和不可修改并不意味着相同的事情,但就本问题而言,它们非常相似。问题基本上归结为让用户知道返回的对象没有完全遵守其约定(即,一些常见操作将抛出运行时异常)

  • 确实要记录下来
  • 提供用于检查给定对象是否为imutable集合的API
  • 返回包装中包含信息的集合,其中的集合是可变的还是不可变的?我最喜欢的解决方案
  • 如果可能,不要使用multable和immutable集合,而是选择其中一个。结果总是不可变的,因为它们是结果——为什么要改变它呢。如果有这样的需要,只需一行就可以将集合复制到新的可变集合并对其进行修改(例如用于链处理)

  • 不是通用的命名约定,但您可能有兴趣使用此
    @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工件中,
    不可变。