我正在查看类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
,我想让它实现这个功能接口,以增加灵活性。
答案 0 :(得分:1)
Reference
比Supplier
早了很多。据我所知,将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表达式。