【发布时间】:2018-08-28 14:01:17
【问题描述】:
我有一个关于在方法中改变方法参数(它们是对象)的问题。
我多次阅读和听到,在作为参数传入的方法中改变对象是一种不好的做法。例如:
public void modifyList(List<Object> list) {
list.add(new Object());
}
相反,传入的 Object 应该被复制,应该对复制的对象执行突变并返回复制的对象。例如:
public List<Object> getModifiedList(List<Object> list) {
List copy = new List<Object();
//Make a deep copy if it would be necessary
for(Object o : list) {
copy.add(o.clone());
}
//Modify the copy
copy.add(new Object());
//return the copy
return copy;
}
我知道第二种方法产生副作用的可能性较小,因为它不会改变输入参数。
但这真的是要走的路吗?性能会受到影响,因为必须创建大量深拷贝。此外,实现 Copy-Constructors 并为所有类实现克隆方法会花费大量时间。它还会极大地增加 LOC。
在实践中,我不经常看到这种模式(复制方法参数)。
有很多经验(作为程序员/软件开发人员工作多年)的人可以回答这个问题吗?
问候 马弗林
【问题讨论】:
-
理想情况下,您不应该修改作为参数传递的对象,除非您非常清楚这是预期的,例如
modifyList应该会修改列表。 -
@AndyTurner
@throws UnsupportedOperationException - if list does not support the add operation:-) -
@assylias 并且不尝试它就无法知道它是否会抛出它。
-
@AndyTurner Collection 的合同规定
add如果不支持操作,则必须抛出 UOE。 -
@assylias 但如果不调用
add,您将无法知道List的给定实例是否支持add。你所能做的就是捕捉异常,并希望你有失败的原子性。
标签: java copy dplyr method-parameters