У меня есть массив слабых ссылок на дополнительные объекты, например, так:
public class Foo{
WeakReference<WeakReference<Bar>[]> cache;
}
public class Bar{
private final WeakReference<Bar>[] ownerCache;
}
Сам массив слабо упоминается по причинам, о которых я не буду go прямо сейчас. Я хочу убедиться, что это не мусор, прежде чем ЛЮБЫЕ объекты Bar достижимы из него. Другими словами, он должен существовать в памяти до тех пор, пока существует любой объект Bar, к которому можно добраться из него. Затем, если больше нет объектов Bar, мне лучше, если массив также будет собирать мусор. (Объекты Bar могут или не могут быть сильно доступны из других мест.) Я сделал это, обратившись к массиву кэша в поле внутри всех объектов Bar. Если поля достаточно для того, чтобы массив был доступен, он не является сборщиком мусора. Однако мой код никогда не использует это поле, и я не могу его опубликовать c. (Я получаю «неиспользуемое» предупреждение об этом.) Я боюсь, что существование такого поля прекращается либо во время компиляции, либо во время выполнения, либо оно может получить специальную обработку от сборщика мусора, о котором я не знаю.
Это правильное решение? Достигает ли это решение того, чего я хочу, независимо от сборщика мусора или реализации JVM? Если нет, то какой метод лучше?