我必须为我正在研究的小型几何相关项目编写一个简单的矢量/矩阵库。这就是我想知道的。
在java环境中对向量进行数学运算时,更好的做法是返回向量的新实例或修改原始状态。
我来回看过它,只想获得多数投入。
某些人说矢量应该是不可变的,静态方法应该用于创建新的,其他人说它们应该是可变的,并且应该使用常规方法来修改它们的状态。我已经在某些情况下看到它,在这种情况下,对象是不可变的,调用普通方法,从对象返回一个新的向量而不改变状态 - 这对我来说似乎有点不对。
我想了解一下,如果有任何最佳实践 - 我想这已经完成了一百万次,我真的只是想知道是否有一种标准的方法来做到这一点。
我注意到apache commons数学库每次都从原来返回一个新的向量。
答案 0 :(得分:5)
表现有多重要?向量算法是否会成为一个大组件,从而影响整个系统的性能?
如果不是并且会有很多并发性,那么不可变向量将是有用的,因为它们会减少并发性问题。
如果向量上存在大量突变,那么不可变向量将需要的新对象的开销将变得非常重要,并且可能更好地拥有可变向量并且难以实现并发性。
答案 1 :(得分:1)
这取决于。一般来说,不变性更好。
首先,它是自动线程安全的。它更容易维护和测试。
也就是说,有时你需要速度来创建新实例需要花费太多时间。
(注意:如果你不是100%肯定你需要那么快的速度,你就不需要它。想想高频交易和实时数学密集型应用程序。尽管如此,你应该简单一点首先,稍后进行优化。)
对于静态与普通方法,遵循良好的OOP原则,您不应该使用静态方法。要创建新的矢量/矩阵,您可以使用构造函数。
接下来,你的支持结构是什么?你最好的选择可能是向量的双维单维数组和矩阵的双维多维数组。这至少可以让你通过使用原始对象保持相对快速。
如果您需要更高的性能,可以在Vector / Matrix上添加可以更改支持数据的修饰符。您甚至可以确定维度是不可变的但内容是可变的,这也会为您提供其他安全性。