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非常大的情况下,此操作很昂贵.
好吧,不要调用一个可以修改它的方法.如果没有复制,你会期望这样的方法做什么?它要么必须表现不同(例如,在add被调用时不做任何事情)或抛出异常.你可以通过将它包装在一个不可修改的列表中来使它抛出异常...但是如果方法的目的是更改集合,你可能不希望抛出异常......
我知道这听起来像是一个陈腐的答案,但我希望它真正触及你需要思考的内容:如果你有一个不应该修改的集合,并且你想调用一个尝试的方法要修改集合,您应该考虑为什么要首先调用该方法.
我确实理解困难的部分是知道哪些方法将修改集合 - 这就是你可以防御性地创建一个不可修改的包装器,或者确保所有相关方法都被正确记录的地方.
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |