方法在自定义对象中是否具有破坏性?

时间:2009-03-09 21:07:57

标签: java oop polynomial-math

我必须将Java.Polynomial实现为学校作业。部分方法是 add(多项式)乘法(多项式)等。

在类似

的情况下
p.add(q); // computes p + q

最好返回void并将多项式的总和保持在p?还是更好地返回多项式并保持p的前值保持不变?

我的直觉告诉我,我应该做以下

  • 将p.add(q)实现为'破坏性'方法...它将q加到p的值并将总和存储在p
  • 还实现了一个静态方法Polynomial.add(p,q),它返回多项式的总和。
你怎么看?

8 个答案:

答案 0 :(得分:7)

我个人非常喜欢不可变类型。我会写p.plus(q)而不是p.add(q)并使其返回一个新的多项式。不变性对它有很大帮助,不仅仅是在线程安全方面(这听起来在这种情况下不会成为问题),而且在推理代码方面也是如此。如果你知道一旦你隐藏了对它的引用,没有任何东西可以改变你脚下的物体的内容,那么预测会发生什么会更加容易。

答案 1 :(得分:6)

这是一种风格问题。当对象不可变时,它通常更好(和“更整洁”),因此方法不是“破坏性的”(它们不是变异器,它们没有副作用)但是返回带有新值的新实例。

最着名的不可变类是String。

答案 2 :(得分:3)

“最好返回多项式并保持p的前一个值完整”

如果您使数字类型的行为与其他数字相同,则生活会更好。

当你必须通过减少内存分配来优化性能时,“破坏性”操作是必不可少的。

权衡是由于变量中更复杂的状态变化,您的处理变得不透明。你不希望隐藏状态改变;你希望你对变量的值赋值是一个很大的,明显的一流的,有一种东西。

答案 3 :(得分:3)

所以每个人都说你应该让它变成不可变的,除非有非常具体的性能原因使它变得可变(你将为一个魔法数据添加十亿个多项式并且不想要内存分配),不变性是要走的路。

如果您有真正的性能原因,您可能希望拥有破坏性和非破坏性版本,但请记住 - 这会导致混淆。我认为你的重载的想法增加是破坏性的或不是基于arity将使事情非常,非常混乱。如果您愿意,最好使所有内容都具有非破坏性,并制作addDestructive(poly p)方法。

答案 4 :(得分:2)

即使您执行“破坏性”方法,您仍然希望返回新值以允许函数链接。并且,对于它的价值,当面对BigInteger和BigDecimal的同样问题时,Sun决定采用非破坏性的方式。

答案 5 :(得分:1)

使其不可变,并使界面与BigInteger相同(尽可能适用)。

答案 6 :(得分:1)

  

最好返回void并将多项式的总和保持在p?

不错,也不一定好。

  

还是更好地返回多项式并保持p的前值保持不变?

更好,更少的惊喜和代码更容易理解和维护。 (尽管你必须创建更多的变量)

答案 7 :(得分:1)

多项式就其变量而言具有固定值,因此它只是真正有意义才是不可变的。为您的操作返回一个新的多项式。