代码之家  ›  专栏  ›  技术社区  ›  Cratylus

Java不同的集合更新模式

  •  1
  • Cratylus  · 技术社区  · 14 年前

    我有一门课,例如 MyDataClass . 我有一个 HashMap<String,MyDataClass> myMap; 对于mymap中的每个引用,我还拥有对同一对象的其他mydataclass引用。具体地说:

    MyDataClass c = new MyDataClass();
    //configure c object with appropriate values
    myMap.put("akeyvalue",c);
    MyDataClass ref = c;
    

    此时,参考和 myMap.get("akeyvalue") 引用内存中的同一对象。 如果我以后做 myMap.remove("akeyvalue") 哈希映射中的条目将被删除,但对象 裁判 仍指同一位置。本质上是价值 mymap.get(“akeyvalue”)。 仍然存在。如何将其更新为空,以便与哈希映射同步?也就是说,如果我有不同的数据结构/集合引用相同的对象,那么使用什么样的最佳模式/设计来保持它们的同步?在我的小示例中,在我删除的代码中 myMap ,我无法访问 裁判 对象。我必须找到 裁判 并且它无效。一般来说,我可以有一个独特的数据结构,例如 List<MyDataClass> refs;

    谢谢你

    4 回复  |  直到 13 年前
        1
  •  0
  •   Bozho Michał Mech    13 年前

    你必须手动操作。如果你想要 remove(..) 在一个集合上影响另一个集合:

    • 延伸 HashMap (或任何收藏)
    • 做一个 private Collection anotherCollection 你班上有二传手和getter
    • 重写 移除(…) ,呼叫 super.remove(..) 也叫 anotherCollection.remove(..)
        2
  •  0
  •   drekka    14 年前

    嗯,我认为你有一些不正确的想法在推动你的问题。首先,从集合中删除“akeyvalue”后,就不能再通过地图访问它了。不管是否有其他变量引用原始值。

    其次,如果您作为开发人员希望保留对同一对象的多个引用,那么您就需要设计软件来清除对它的所有引用,将它的引用计数减少到零,并允许垃圾收集器回收内存。例如,在可用对象的映射和已用对象的映射中引用同一对象是多个映射的一个实际示例。你必须维护它们。

    在您的示例中,不需要清除ref.simple,因为它将在当前方法的末尾自动清除。做你要问的是我们做的事情如目标C iPhone开发,但不必要的Java开发。

        3
  •  0
  •   Eyal Schneider    14 年前

    “如果我有不同的数据结构/集合引用相同的对象,那么最好使用什么样的模式/设计来保持它们的同步?”

    我相信答案是 包封 . 如果将相关的数据结构保存在一个具有清晰API的类下,那么API可用的任何操作都可以更新它们并使它们保持同步。这些数据结构应该是隐藏的;这样可以保证对它们的任何访问都由封装类控制。

        4
  •  0
  •   Bozho Michał Mech    14 年前

    我同意Bozho-子类 HashMap 并添加一种向新类添加侦听器的方法。 重写 clear() remove() 打电话给 onDelete(Object o) 在你的听众中。
    当其他对象想知道什么时候删除了某个内容时,只需向您的 哈希图 并实施 OnDelete(对象O) 方法,然后通知他们。