found = true;
行
public boolean containsBlock(String nodeName, ASTNode node)
{
boolean found = false;
if(nodeName.equals("if"))
{
node.accept(new ASTVisitor()
{
public boolean visit(IfStatement s)
{
found = true;
return false;
}
});
}
return found;
}
我知道如果我将found
作为一个类全局变量,我将能够访问它,但我不想这样做。也许有另一种方式?我只需要让其他代码知道发现了什么
UPD: 该代码是否更好并将返回正确的
public boolean containsBlock(Text nodeName, ASTNode node)
{
final AtomicBoolean flag = new AtomicBoolean(false);
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
if(nodeName.matches("if"))
{
node.accept(new ASTVisitor()
{
public boolean visit(IfStatement s)
{
flag.set(true);
return false;
}
});
}
else
throw new RuntimeException("Unknown NodeName: " + nodeName);
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag.get();
}
答案 0 :(得分:3)
当您将ASTVisitor
实例传递给ASTNode
实例(使用accept方法)时,它不会立即执行您的visit
方法。因此,没有必要尝试从containsBlock
方法中更改visit
方法的局部变量。
visit
很可能在您的containsBlock
方法返回后执行,此时您的本地found
变量将不再位于调用堆栈中。