为什么没有 StrongReference 对象?

2022-09-02 14:01:09

我正在实现一些行为,这些行为可以从某些时候使用弱引用中受益。我希望该类的用户能够在构建时指示是否属于这种情况。由于乍一看扩展,我似乎可以做这样的事情(这是一个模型,而不是我实际上想要做的事情):WeakReferenceReference

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

但是没有类,根据参考javadocsStrongReference

由于引用对象是与垃圾回收器密切合作实现的,因此此类可能不会直接子类化。

因此,我无法创建自己的参考子类,该子类包含对对象的强(即正常)引用。这似乎意味着不可能创建一个类来隐藏它是否使用来自调用方的弱(或软)引用。

我真的不明白为什么这个类不存在,一个对象应该总是从get()返回对象,除非已经调用了clear()。为什么缺少它?是否以某种方式与不一致?这将使构建通用引用持有者对象变得更加简单。StrongReferenceStrongReferenceReference


答案 1

当我需要这样做时,我只是创建了一个自定义引用接口和一个微不足道的弱引用子类。这很烦人,但它和你能做的一样好。

public interface MyReference<T> {
  public T get();
}

public class MyWeakReference<T> extends WeakReference<T> implements MyReference<T> {
}

public class MyStrongReference<T> implements MyReference<T> {
  // obvious implementation here ...
}

更新:

澄清一下,我不知道为什么这首先没有包含在jdk中(我也希望它曾经如此),但是,我觉得这是一个合理的解决方法。

对于那些寻求这个想法合理性的人来说,我发现在实现自定义缓存时是必要的,其中引用的强度是缓存配置的一部分。


答案 2

不能子类引用,因为它没有任何公共/受保护的构造函数。但是有一个解决方法:

class StrongReference<T> extends WeakReference<T> {
    private final T referent;

    StrongReference(T referent) {
        super(null);
        this.referent = referent;
    }

    @Override
    public T get() {
        return referent;
    }

    // implement other methods
}