Я реализую некоторое поведение, которое может извлечь выгоду из использования слабых ссылок некоторое время. Я хотел бы, чтобы пользователь класса мог указать на время строительства, является ли это так или нет. Поскольку WeakReference
extends Reference
на первый взгляд кажется, что я мог бы что-то сделать (это макет, а не то, что я на самом деле пытаюсь сделать):
public class Container<T> {
private boolean useWeakRef;
private Reference<T> ref;
public Container(boolean isWeak) {
useWeakRef = isWeak;
}
public void store(T val) {
if(useWeakRef) {
ref = new WeakReference<>(val);
} else {
ref = new StrongReference<>(val);
}
}
// May return null
public T get() {
return ref.get();
}
}
Однако нет класса StrongReference
и в соответствии с Reference javadocs:
Поскольку эталонные объекты реализованы в тесном сотрудничестве с сборщиком мусора, этот класс не может быть подклассифицирован напрямую.
Поэтому я не могу создать свой собственный подкласс Reference, который содержит сильную (то есть нормальную) ссылку на объект. Это означает, что невозможно создать класс, который скрывает, использует ли он слабые (или мягкие) ссылки от вызывающего.
Я действительно не понимаю, почему этот класс не существует, объект StrongReference
должен просто всегда возвращать объект из get(), если не был вызван clear(). Почему это отсутствует? Является ли StrongReference
несовместимым с Reference
каким-то образом? Это значительно упростило бы создание общих объектов опорных держателей.