Java 方法引用是否摆脱了可重写的方法调用?

Java 方法引用是否摆脱了可重写的方法调用?,java,constructor,lambda,overriding,java-8,Java,Constructor,Lambda,Overriding,Java 8,我正在编写以下代码,并注意到警告消息中存在差异: public abstract class Yielder<E> implements Iterator<E> { private final Object lock = new Object(); private final Thread yieldThread; private E element; public Yielder() { this.yieldThre

我正在编写以下代码,并注意到警告消息中存在差异:

public abstract class Yielder<E> implements Iterator<E> {
    private final Object lock = new Object();

    private final Thread yieldThread;

    private E element;

    public Yielder() {
        this.yieldThread = new Thread(this::getYields);
        startThreads();
    }

    private void startThreads() {
        yieldThread.start();
    }

    @Override
    public boolean hasNext() {
        //impl
    }

    @Override
    public E next() {
        //impl
    }

    protected void yield(final E yield) {
        //impl
    }

    abstract protected void getYields();
}
公共抽象类实现迭代器{
私有最终对象锁=新对象();
私有最终线程yieldThread;
私人电子元件;
公营机构({
this.yieldThread=新线程(this::getYields);
startThreads();
}
私有void startThreads(){
yieldThread.start();
}
@凌驾
公共布尔hasNext(){
//恳求
}
@凌驾
公共教育{
//恳求
}
保护孔隙屈服(最终E屈服){
//恳求
}
抽象受保护的void getYields();
}

public类递增Yielder扩展Yielder{
@凌驾
受保护的void getYields(){
int i=0;
while(true){
产量(i++);
}
}
}
Yielder
的构造函数中,如果我写:

  • this.yieldThread=new Thread(()->getYields())
    ,我在构造函数中得到一个警告
    可重写的方法调用
  • this.yieldThread=新线程(this::getYields)
    ,然后一切正常

这里真的有区别吗?或者Netbeans 8.0测试版还没有配置为警告方法引用吗?

没有,这两种用法没有区别。特别是在这种情况下,您可以从引用的方法是
abstract
这一事实中得出答案。任何调用此方法的代码都必须以重写的方法结束

在这种特殊情况下,IDE在这两种情况下都应该警告您—不是因为您在调用构造函数中的可重写方法,而是因为
this
实例从构造函数中转义

无论使用哪种构造,lambda还是方法引用,代码都不是线程安全的。您甚至冒着启动线程中断的风险,因为它们可能会看到锁对象的
null

把它放在一行中,永远不要从构造函数中启动线程

public class IncrementingYielder extends Yielder<Integer> {
    @Override
    protected void getYields() {
        int i = 0;
        while (true) {
            yield(i++);
        }
    }
}