2012-10-28 161 views
2

我想更新對全局對象的引用(與Update all references to an object when the object is updated(reference to a reference)幾乎相同的問題)。Java:全局更新對象引用

我有以下的代碼結構:

class Triangle { 
    Vertex pos[]; 
    //... 
} 

ArrayList<Vertex> vertices; 

ArrayList<Triangle> triangles; 

// Load triangles from file. After all triangles are loaded, 
// fill the vertices list with all vertices of all triangles. 

正如你可以在代碼示例中看到,第一個三角形被加載。我的一些附加算法只需要所有頂點的列表。所以爲了提高性能,所有三角形的所有頂點都插入到頂點列表中,算法只獲取列表。

讓我們說我有三角形T1(a,b,c),T2(d,e,f)T3(e,g,h)。 頂點包含然後[a,b,c,d,e,f,g,h]

在一個算法中,我需要用另一個替換頂點。例如e被刪除並替換爲a

通常你會做這個用下面的代碼來獲得更新的三角形T1(a,b,c)T2(d,a,f)T3(a,g,h)

for (Triangle t : triangles) { 
    for (int i=0; i<3; i++) { 
     if (t.pos[i] == e) 
      t.pos[i] = a; 
    } 
} 

是否有另一種方式來有效地更新其指向e所有引用,從而使新參考目標是a。 例如,而不是使用循環和全三角形迭代(這是不那麼有效的)這樣一個電話將是有益的:

Java.updateReferences(e,a); 

感謝

+0

請參閱[Observer-Observable](http://www.codeguru.com/java/tij/tij0175.shtml)模式 – kolossus

回答

3

它看起來對我來說,頂點類應該簡單地可以改變座標:

e.setCoordinates(a.getCoordinates()); 

這樣,所有對e的引用都會自動獲得新座標。如果這不是一種選擇,也許你應該將頂點對象包裝到一個MutableVertex對象中,並使三角形對象和頂點列表包含MutableVertex的實例。

+0

頂點不能是可變的,因爲它包含一些其他信息,例如,它的法向量。這在更換後得到計算。因此,根據您的第一個建議,該算法需要計算兩個相同向量的法線。 使用MutableVertex可能是一個選項,但這需要更新已經存在的代碼(這是相當多的代碼) – SailAvid

+1

有沒有辦法做到這一點,不涉及重大代碼的重寫。你不能做你想做的事。 –

0

你可以有一個'智能'List implmentation,用於尋找飛行中的頂點。例如,它可能有

int size(){return triangles.size()* 3; }

Vertex get(int i){return triangles.get(i/3).getVertex(i%3); }

或者其他的東西。考慮擴展java.util.AbstractList。

+0

這不起作用,因爲頂點列表的長度不是三角形* 3的長度,因爲一些頂點是在三角形之間共享的。所以依賴於頂點列表的算法會分析比需要更多的頂點。 – SailAvid