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