Java:全局更新对象引用

时间:2012-10-28 17:33:27

标签: java object pointers reference

我想全局更新对象的引用(与Update all references to an object when the object is updated(reference to a reference)几乎相同的问题)。

我有以下代码结构:

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);

由于

2 个答案:

答案 0 :(得分:3)

在我看来,顶点类应该只是可变的,你应该只改变它的坐标:

e.setCoordinates(a.getCoordinates());

这样,对e的所有引用都会自动获得新坐标。如果这不是一个选项,也许您应该将Vertex对象包装到MutableVertex对象中,并使三角形对象和顶点列表包含MutableVertex的实例。

答案 1 :(得分:0)

您可以拥有一个“智能”列表实现,可以动态查找顶点。例如,它可能有

  

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

     

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

或类似的东西。考虑扩展java.util.AbstractList。