为什么java.lang.ref.Reference <t>没有实现Supplier <t>?

时间:2015-10-28 20:28:53

标签: java reference garbage-collection functional-interface

我正在查看类java.lang.ref.Reference(以及它的子类),我想知道为什么它没有实现Java 8的Supplier<T>接口。

似乎这应该是一个明智的选择。 get()满足供应商的Reference方法。我犹豫是否实施SoftReference<T>我自己的扩展同样实现Supplier<T>的唯一原因是因为我知道References是垃圾收集器特有的。{/ p>

在制作像这样的课程时,你是否有任何问题可以预见

public class SoftReferenceSupplier<T> extends SoftReference<T> implements Supplier<T>
{
    public SoftReferenceSupplier(T referent)
    {
        super(referent);
    }

    public SoftReferenceSupplier<T referent, ReferenceQueue<? super T> queue)
    {
        super(referent,queue);
    }
}

我不想以某种方式破坏SoftReferences的目的,因为一些垃圾收集警告干扰了供应商的处理方式。

BTW,我知道SoftReferences将在完整垃圾回收时返回null。我的程序中需要SoftReferences,我想让它实现这个功能接口,以增加灵活性。

2 个答案:

答案 0 :(得分:1)

ReferenceSupplier早了很多。据我所知,将Reference<T>更改为实施Supplier<T>不会破坏任何现有代码,但在我看来,它并没有多大意义。当所有新的功能接口都被引入到语言中时,就可以遍历每个现有的类,并使每个类实现每个新的功能接口碰巧都有匹配的方法,但是我看不到价值。

在许多情况下,实际上实际实现功能接口的类没有意义,因为如果您需要将对象视为功能接口的实例,则可以使用方法引用。

Reference<Object> reference = new WeakReference<>(someObject);
Supplier<Object> supplier = reference::get; 

此解决方案取决于两个方法都被称为get的事实,因此在我看来,最好使Reference实现{{} 1}}。

答案 1 :(得分:0)

我做了一些谷歌搜索,但没有找到任何与Java Reference class未实现Supplier interface的原因有关的内容。但是Supplier的Javadoc留下了一些线索。我认为答案在于如何将Supplier引入Java - 即作为用于Lambda表达式的函数式编程接口。两个get()方法的含义只是意味着逻辑上不同的东西。 Reference类的实例的get()方法返回指示对象; get()实例的Supplier方法返回lambda表达式的结果。很难想象两者之间的语义重叠,除非我创建一个涉及JVM软,弱和/或幻像引用的lambda表达式。