考虑以下场景。
您正在用 java 构建一个类,其中类的基本语义要求该类的两个实例的值不相等,除非它们实际上是同一个对象(参见 Joshua Bloch 的 Effective Java 中的实例控制类)。从某种意义上说,这就像一个非常大的枚举(可能是数亿个“常量”),直到运行时才知道。因此,回顾一下,您希望该类确保堆上没有“相等”的实例。堆上可能有很多对特定对象的引用,但没有无关的相等对象。这显然可以在代码中完成,但在我看来,存在一个我在任何地方都没有看到的重大缺陷,包括在 Effective Java 中。在我看来,为了保证这一点,实例控制类必须保留对在程序执行期间的任何时候创建的每个实例的引用,并且永远不能“删除”其中一个对象,因为它永远不能知道不再有任何指向该对象的“指针”(除了它本身保留的那个)。换句话说,如果你在引用计数的上下文中考虑这一点,在程序中会出现对对象的唯一引用是类本身持有的引用(那个说,“this is created在某一点”)。那时你想释放与对象相关的内存,但你不能,因为剩下的一个指针无法知道它是最后一个。这些对象之一,因为它永远无法知道不再有任何“指针”指向该对象(除了它自己保留的那个)。换句话说,如果你在引用计数的上下文中考虑这一点,在程序中会出现对对象的唯一引用是类本身持有的引用(那个说,“this is created在某一点”)。那时你想释放与对象相关的内存,但你不能,因为剩下的一个指针无法知道它是最后一个。这些对象之一,因为它永远无法知道不再有任何“指针”指向该对象(除了它自己保留的那个)。换句话说,如果你在引用计数的上下文中考虑这一点,在程序中会出现对对象的唯一引用是类本身持有的引用(那个说,“this is created在某一点”)。那时你想释放与对象相关的内存,但你不能,因为剩下的一个指针无法知道它是最后一个。程序中会出现某个点,其中对对象的唯一引用是类本身持有的那个(那个说,“这是在某个时候创建的”)。那时你想释放与对象相关的内存,但你不能,因为剩下的一个指针无法知道它是最后一个。程序中会出现某个点,其中对对象的唯一引用是类本身持有的那个(那个说,“这是在某个时候创建的”)。那时你想释放与对象相关的内存,但你不能,因为剩下的一个指针无法知道它是最后一个。
有没有一种很好的方法来提供实例控制的类,这些类也可以释放不再需要的内存?
更新:所以,我想我找到了一些可能有帮助的东西。原来 java 有一个 java.lang.ref 类提供弱引用。来自维基百科:“WeakReference 用于实现弱映射。不是强或软可访问但被弱引用引用的对象称为“弱可访问”。弱可访问对象在下一个收集周期中被垃圾收集。这种行为在 java.util.WeakHashMap 类中使用。弱映射允许程序员将键/值对放入映射中,而不必担心当键在其他任何地方都无法访问时对象占用内存。另一个可能的应用程序弱引用的对象是字符串实习池。从语义上讲,弱引用意味着“在下一次垃圾回收时没有其他对象引用它时删除该对象”。