"这"在匿名内部对象中

时间:2014-08-10 21:47:01

标签: java groovy closures inner-classes anonymous-class

我想写一个这个java代码的groovy版本:

class HelloWorld {
    static main(args) {
        def server = Server.builder()
                .setHandler(new HttpHandler() {
                      public void handle(final Ev ev){
                          ev.dispatch(this)
                      }
                    }
                }).build()
        server.start()
    }
}

我得到的groovy代码是:

class HelloWorld {
    static main(args) {
        def server = Server.builder()
                .setHandler(new HttpHandler() {
                      public void handle(final Ev ev){
                          ev.dispatch(this)
                      }
                    }
                }).build()
        server.start()
    }
}

问题来自ev.dispatch(this):ev.dispatch需要一个HttpHandler对象但是"这个"在groovy中,即使是类型转换,也不会产生HttpHandler对象。

我试过替换"这个"与"委托"或"所有者"但没有改变。

我试图用一个闭包替换anonim内部类,但没有不同的esit:

class HelloWorld {
    static main(args) {
        def server = Server.builder()
                .setHandler({ ev -> 
                      public void handle(final Ev ev){
                          ev.dispatch(this)
                      }
                    } as HttpHandler
                ).build()
        server.start()
    }
}

有什么建议吗? (使用groovy 2.3.6)

2 个答案:

答案 0 :(得分:1)

以下有两个问题:

class HelloWorld {
    static main(args) {
        def server = Server.builder()
                .setHandler(new HttpHandler() {
                      public void handle(final Ev ev){
                          ev.dispatch(this)
                      }
                    }
                }).build()
        server.start()
    }
}

一个是匿名内部类定义中不匹配的花括号。当应该只有2个时,连续3个花括号(})。

另一个似乎是Groovy中的一个错误。请参阅https://jira.codehaus.org/browse/GROOVY-7020

答案 1 :(得分:0)

在Groovy中,封闭内的this, owner and delegate usually mean the same thing

Groovy(具有讽刺意味?)并不允许您通过关键字匿名引用匿名闭包。您必须在所有者的范围内命名闭包,然后您可以通过该名称引用它。如果您将其声明为所有者中的字段,那么您应该能够直接自引用,但在这种情况下,您可以在静态方法中声明它,这样可能无法正常工作。相反,您只需设置handler.delegate = handler,然后在闭包内使用delegate进行自我引用。

另外,我不认为你应该在闭包中声明一个方法 - 你只需要直接编写代码。我想这就是你想要的:

class HelloWorld {
    static main(args) {
        def handler = { ev -> 
            ev.dispatch(delegate)
        } as HttpHandler
        handler.delegate = handler
        def server = Server.builder()
                .setHandler(handler).build()
        server.start()
    }
}

这样可以解决使用闭包应该给你的一些简洁,但显然这就是你所坚持的。