在java mehod调用中保持参数不变

Cha*_*bel 0 java const-correctness mutability

如果我想调用这样的方法:

  List f(List l){
      l.add(new Object());
      return l;
  }
Run Code Online (Sandbox Code Playgroud)

一切都很好,除非我调用该方法,它实际上修改了它的参数,反正在那周围?

// suppose l is instantiated at this point
log.info(l.count());// prints 0
f(l);
log.info(l.count());// prints 1
Run Code Online (Sandbox Code Playgroud)

无论如何在java中声明f以保持l不变?

我知道我可以在l上执行深度克隆并传递它,但是在l非常大的情况下,此操作很昂贵.

Jon*_*eet 6

好吧,不要调用一个可以修改它的方法.如果没有复制,你会期望这样的方法做什么?它要么必须表现不同(例如,在add被调用时不做任何事情)或抛出异常.你可以通过将它包装在一个不可修改的列表中来使它抛出异常...但是如果方法的目的是更改集合,你可能希望抛出异常......

我知道这听起来像是一个陈腐的答案,但我希望它真正触及你需要思考的内容:如果你有一个不应该修改的集合,并且你想调用一个尝试的方法要修改集合,您应该考虑为什么要首先调用该方法.

我确实理解困难的部分是知道哪些方法修改集合 - 这就是你可以防御性地创建一个不可修改的包装器,或者确保所有相关方法都被正确记录的地方.