每次调用类方法时都要避免计算

时间:2011-11-15 17:16:20

标签: java oop

我不知道标题是否合适,但这是一个设计问题。 我正在设计一个Java类,它有一个重度计算的方法,我想知道每次调用该方法时都有一种干净的方法来避免这种计算。我知道调用代码可以处理这个,但它应该始终是调用代码的责任吗?

详细说明 - 我正在用一种计算幅度的方法编写一个千维向量的类。所以每次调用这个方法时,它都将计算所有维度的幅度。

5 个答案:

答案 0 :(得分:3)

您正在寻找的概念称为Memoization

答案 1 :(得分:0)

只需将结果缓存在类的内部结构中。一旦调用该方法,它就会查看它是否在缓存中具有先前计算的结果并返回它。在另一种情况下,它进行计算并将结果存储在缓存中。但要小心记忆。

答案 2 :(得分:0)

使用flag指示是否对载体进行了更改。如果存在更改,则该方法应该进行完整计算或仅将计算应用于更改,但是您需要对所有其他类的实现进行测试,并确保每次都正确设置该标志价值被修改。

第二种方法是使用缓存。这是通过存储先前计算的结果并在进行计算之前查找来完成的。但是,如果您的对象的键值没有太多变化,这种方法只能很好地工作,否则最终会占用大量内存。特别是,如果您的键值具有double类型,则如果键值不完全相等,则可能永远不会找到键值。

答案 3 :(得分:0)

如果在“c'tor”中传递“千位向量”,则可以计算c'tor中的大小并存储在某个私有成员变量中。

很少有事情需要照顾:

  • 如果有添加/删除矢量或矢量内容的方法,则需要更新这些方法的幅度。
  • 如果您的类应该是线程安全的,那么确保适当的写入函数是原子的。

答案 4 :(得分:0)

幅度变化的频率是多少?这是不可改变的吗?你控制了多少矢量接口?具体来说,您是否有办法在1000维空间中识别旋转或其他保持大小的变换?您可以只为状态存储状态,在值更改时标记,并仅在必要时重新计算。如果您的转换具有良好的内部结构,则可以基于该知识跳过计算。