java矩阵/向量库中的最佳实践

时间:2011-10-11 15:50:00

标签: java coding-style vector

我必须为我正在研究的小型几何相关项目编写一个简单的矢量/矩阵库。这就是我想知道的。

在java环境中对向量进行数学运算时,更好的做法是返回向量的新实例或修改原始状态。

我来回看过它,只想获得多数投入。

某些人说矢量应该是不可变的,静态方法应该用于创建新的,其他人说它们应该是可变的,并且应该使用常规方法来修改它们的状态。我已经在某些情况下看到它,在这种情况下,对象是不可变的,调用普通方法,从对象返回一个新的向量而不改变状态 - 这对我来说似乎有点不对。

我想了解一下,如果有任何最佳实践 - 我想这已经完成了一百万次,我真的只是想知道是否有一种标准的方法来做到这一点。

我注意到apache commons数学库每次都从原来返回一个新的向量。

2 个答案:

答案 0 :(得分:5)

表现有多重要?向量算法是否会成为一个大组件,从而影响整个系统的性能?

如果不是并且会有很多并发性,那么不可变向量将是有用的,因为它们会减少并发性问题。

如果向量上存在大量突变,那么不可变向量将需要的新对象的开销将变得非常重要,并且可能更好地拥有可变向量并且难以实现并发性。

答案 1 :(得分:1)

这取决于。一般来说,不变性更好。

首先,它是自动线程安全的。它更容易维护和测试。

也就是说,有时你需要速度来创建新实例需要花费太多时间。

(注意:如果你不是100%肯定你需要那么快的速度,你就不需要它。想想高频交易和实时数学密集型应用程序。尽管如此,你应该简单一点首先,稍后进行优化。)

对于静态与普通方法,遵循良好的OOP原则,您不应该使用静态方法。要创建新的矢量/矩阵,您可以使用构造函数。

接下来,你的支持结构是什么?你最好的选择可能是向量的双维单维数组和矩阵的双维多维数组。这至少可以让你通过使用原始对象保持相对快速。

如果您需要更高的性能,可以在Vector / Matrix上添加可以更改支持数据的修饰符。您甚至可以确定维度是不可变的但内容是可变的,这也会为您提供其他安全性。