我被告知,突变会导致方法依赖于顺序(例如 Mutation )
但是,考虑到以下方法(为了简单起见,忽略 null),我看不出在给定相同参数的情况下,两者的行为有何不同。
void x(StringBuffer s) {
s.append("a");
}
StringBuffer y(StringBuffer s) {
return new StringBuffer(s.toString()).append("a");
}
所以我的问题是:
- 由于方法 x 会改变输入,因此是否存在与方法 x 相关的排序问题?
- x 可以被认为有副作用,但是,这实际上比方法 y 有什么缺点吗?比如 y 更容易并行化?
最佳答案
如果在 y
之后运行 x
,您会得到不同的输出,尽管 y
的调用看起来是相同的。
StringBuffer stringBuffer = new StringBuffer();
x(stringBuffer);
System.out.println(y(stringBuffer)); // gives aa
StringBuffer stringBuffer = new StringBuffer();
System.out.println(y(stringBuffer)); // gives a
x(stringBuffer);
在这个小示例中,stringBuffer
中实例的内部状态决定了输出,并且何时调用哪个方法的详细信息对此很重要。
x
有一个副作用,因为它会更改 StringBuffer
实例的状态。这样做可能有几个优点和缺点,讨论这些超出了范围。
PS:在Java中使用StringBuilder
而不是StringBuffer
。
关于java - 变异参数是否总是会引入依赖于顺序的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48383747/