java - 变异参数是否总是会引入依赖于顺序的行为?

标签 java functional-programming mutation

我被告知,突变会导致方法依赖于顺序(例如 Mutation )

但是,考虑到以下方法(为了简单起见,忽略 null),我看不出在给定相同参数的情况下,两者的行为有何不同。

void x(StringBuffer s) {
    s.append("a");
}

StringBuffer y(StringBuffer s) {
    return new StringBuffer(s.toString()).append("a");
}

所以我的问题是:

  1. 由于方法 x 会改变输入,因此是否存在与方法 x 相关的排序问题?
  2. 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/

相关文章:

javascript - 如何使 k 均值算法发挥作用

python - 遗传算法如何在不知道搜索量的情况下优化神经网络的权重?

java - 解密方法返回 null

java - Jython 中隐藏的多线程瓶颈?

types - 求和类型的结构类型

haskell - 高阶函数的计算复杂性?

java - 为什么在这个例子中没有调用子类方法,因为它在 Java 的动态多态中被调用?

java - QC ALM ( QC 11) 身份验证时 REST Api 400 错误

graph - 对图应用交叉和变异(遗传算法)

arrays - 多维数组、Vuex 和突变