Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-从匿名类访问局部变量_Java - Fatal编程技术网

Java-从匿名类访问局部变量

Java-从匿名类访问局部变量,java,Java,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

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

当您将
ASTVisitor
实例传递给
ASTNode
实例(使用accept方法)时,它不会立即执行
visit
方法。因此,尝试从
visit
方法中更改
containsBlock
方法的局部变量是没有意义的


visit
很可能在
containsBlock
方法返回后执行,此时找到的本地
变量将不再位于调用堆栈中。

ASTVisitor
实例传递给
ASTNode
实例时(使用accept方法),它不会立即执行您的
visit
方法。因此,尝试从
visit
方法中更改
containsBlock
方法的局部变量是没有意义的


visit
很可能在
containsBlock
方法返回后执行,此时找到的本地
变量将不再位于调用堆栈中。

ASTVisitor
实例传递给
ASTNode
实例时(使用accept方法),它不会立即执行您的
visit
方法。因此,尝试从
visit
方法中更改
containsBlock
方法的局部变量是没有意义的


visit
很可能在
containsBlock
方法返回后执行,此时找到的本地
变量将不再位于调用堆栈中。

ASTVisitor
实例传递给
ASTNode
实例时(使用accept方法),它不会立即执行您的
visit
方法。因此,尝试从
visit
方法中更改
containsBlock
方法的局部变量是没有意义的



visit
很可能在
containsBlock
方法返回后执行,此时您的本地
found
变量将不再位于调用堆栈中。

我认为这是不可能的。你到底想做什么?我感觉有XY问题。@markspace,这是解析源代码的方法。我试图检测
ASTNode
中的一些元素(if语句、cycle语句、block语句等)。我们看什么取决于
节点名
。如果在源代码的给定部分从中发现了一些东西,我们应该了解它并更改flag变量并返回result@ivan你的旗帜没用。如果代码的执行顺序不正确(这里可能就是这种情况,因为我怀疑这里是延迟调用还是异步调用),那么几乎所有的时间都会返回false(除非您在另一个线程中进行ASTNode处理,而且速度必须非常快,请注意)。如果您希望该标志起作用,您必须为其创建一个外部字段,并完全跳过
返回
,使其成为一个持久数据。非线性代码(即使不是多线程代码,也包括访问者模式)不像同步代码和线性代码那样工作。@ivan如果您告诉我们您希望代码提供什么功能以及使用什么库,那就更好了。您的第二个代码没有意义,原因与第一个代码没有意义的原因相同——Runnable将立即完成,将访问者添加到节点。如果您100%确定这是实现所需的方法,那么在接受来自visit()方法的通知后,应该在containsBlock()方法中等待(阻塞),然后在另一个线程中处理节点的树以触发visit()。我想有很多更简单的方法,但是没有自由裁判…@vaxquis,我明白了。我使用JDT并希望获得所有需要的语句(需要的语句取决于
nodeName
,可能是
if
for
while
或etc语句)。但是我还没有准备好创建大量扩展
ASTVisitor
的类,因为有很多方法在不同的用途中使用ASTVisitor。我的选择是匿名类,但如何等待它们呢?我认为这是不可能的。你到底想做什么?我感觉有XY问题。@markspace,这是解析源代码的方法。我试图检测
ASTNode
中的一些元素(if语句、cycle语句、block语句等)。我们看什么取决于
节点名
。如果在源代码的给定部分从中发现了一些东西,我们应该了解它并更改flag变量并返回result@ivan你的旗帜没用。如果代码的执行顺序不正确(这里可能就是这种情况,因为我怀疑这里是延迟调用还是异步调用),那么几乎所有的时间都会返回false(除非您在另一个线程中进行ASTNode处理,而且速度必须非常快,请注意)。如果您希望该标志起作用,您必须为其创建一个外部字段,并完全跳过
返回
,使其成为一个持久数据。非线性代码(即使不是多线程代码,也包括访问者模式)不像同步代码和线性代码那样工作。@ivan如果您告诉我们您希望代码提供什么功能以及使用什么库,那就更好了。您的第二个代码没有意义,原因与第一个代码没有意义的原因相同——Runnable将立即完成,将访问者添加到节点。如果你100%确信这是实现你梦想的方法