【发布时间】:2012-04-11 17:30:26
【问题描述】:
我最近一直在玩 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 }
【问题讨论】:
-
您能提供任何语言的代码示例吗?访问者用于避免向下转换和
instanceof- 闭包(实际上,您可能是指代码块和高阶函数)如何帮助解决这个问题? -
@TomaszNurkiewicz 好了,访问者模式似乎几乎像 Groovy 一样简洁地模拟了闭包。
-
恕我直言,最大的区别是闭包更简洁。还有其他一些使关闭更自然的怪癖。
-
你不是说 groovy 中的
each就像是访问者模式的简洁实现吗?除了each,还有更多的闭包 -
@PeterLawrey 大部分 bloadt 都来自这样一个事实,即没有用于 arraylist 的可变参数构造函数,然后是 2 行用于定义内部类及其方法的额外行。
标签: java oop design-patterns groovy closures