2011-11-15 32 views
1

我不知道標題是否合適,但這是一個設計問題。 我正在設計一個Java類,它有一個重度計算的方法,我想知道有一種乾淨的方法可以在每次調用方法時都避免這種計算。我知道調用代碼可以處理這個問題,但它應該始終是調用代碼的責任?每次調用類方法時都要避免計算

詳細說明 - 我正在用一種方法來計算千度矢量的類,以計算幅度。所以每次調用這個方法時,它都會計算所有維度上的幅度。

+1

隱藏緩存後面的計算,只有在向量更新後才重新計算? – mcfinnigan

回答

0

只需將結果緩存在班級內部的某些結構中即可。一旦調用該方法,它就會查看它是否具有先前在緩存中計算的結果並將其返回。在另一種情況下,它執行計算並將結果存儲在緩存中。儘管如此,請注意記憶。

0

使用標誌指示是否有改變你的載體或沒有這個概念。如果有變化,那麼該方法應該做一個完整的計算或者只對變化應用計算,但是你需要考慮到班上其他人的所有實現,並且確保該標誌在每次值被修改。

第二種方法是使用緩存。這是通過存儲之前計算的結果並在計算之前查找它來完成的。但是,如果你的對象的關鍵值沒有太多變化,那麼這種方法只能工作得很好,否則你最終會使用大量的內存。尤其是,如果您的鍵值具有double類型,那麼如果它們不完全相等,則可能不會找到鍵值。

0

如果「千維向量」在c'tor中傳遞,您可以計算c'tor的大小並存儲在某個私有成員變量中。

幾件事情要照顧的是:

  • 如果有方法來添加/刪除載體或載體的內容,那麼你需要更新這些方法的幅度。
  • 如果你的類應該是線程安全的,那麼確保適當的寫入函數是原子的。
0

幅度有多大變化?這是不可變的嗎?你控制的矢量界面有多少?具體而言,您是否有任何方法來確定1000維空間中的旋轉或其他保持量級的變換?您可以只爲狀態存儲狀態,當值更改時標記,僅在必要時重新計算。如果你的轉換有很好的內部結構,你可以跳過基於這些知識的計算。

相關問題