我最近一直在与Groovy一起玩,并且以前与JRuby混为一谈,并欣赏在其收藏夹中使用.each{}闭包。

就是说,我不禁觉得这对访客模式来说只是语法糖。如果将代码封装在类的闭包体内,并使用访问者模式传递该类的实例,则看起来完全一样,尽管麻烦程度较小。

那么,还有其他我还没有看到的闭包功能使它们与访问者模式根本不同,还是人们真的对这种语法糖感到兴奋?

在我看来,这似乎更多是图书馆问题,而不是语言问题。



这是一个Java列表的快速模型,它看起来像Groovy列表中的each闭包。

public class ClosureList<E> extends ArrayList<E>{

    interface Visitor<E>{
            void visit( E e );
    }

    void accept( Visitor<E> v ){
        for( Iterator<E> myItr = this.iterator(); myItr.hasNext() )
            v.visit( myItr.next() );
    }

}


然后有

public class ClosureTest{
    public static void main( String[] args ){
        ClosureList<String> myList = new ClosureList<String>();
        myList.add( "green eggs" );
        myList.add( "green ham"  );


        clStr.accept(
                new Visitor<String>(){
                    void visit( String s ){
                        System.out.println( s )
                    }
                }
            );
    }
}


在Groovy中看起来是一样的:

def l = [ "green eggs", "green ham" ]
l.each{ println it }

最佳答案

如果您要说的是每个功能都是访客模式的实现,那您是对的。您可以传递闭包,而不是传递接口的匿名实现。

关闭不是访客。在这种情况下,使用闭包来实现访客。

当然,在内部,闭包是通过内部类实现的,因此,如果您要说闭包并不是什么神奇的事情,我们大多数人都会同意。

关于Java中的闭包和匿名类之间的区别,有一些重要的作用域要点,最明显的是对非最终变量的访问以及可配置的委派策略。

在groovy中,您还可以通过指定对实例方法的引用来实例化闭包,如下所示:

def c=this.&doSomething


这将创建一个MethodClosure,您将可以使用该方法来传输方法,并减少从类到方法的模块化程度。

因此,我们开始与访客模式相去甚远,不是吗?

我认为,最终,根据我的理解,闭包是一种使方法成为一流公民并从功能样式编程中获益的面向对象方法。

关于java - 关闭和访客模式之间有显着差异吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10110971/

10-12 19:19