gpt4 book ai didi

java - 关闭和访客模式之间有显着差异吗?

转载 作者:行者123 更新时间:2023-12-01 22:43:40 25 4
gpt4 key购买 nike

我最近一直在使用 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 }

最佳答案

如果您的观点是每个函数是访问者模式的实现,那么您是对的。您不是传递接口(interface)的匿名实现,而是传递闭包。

闭包不是访客。在本例中,使用闭包来实现访问者。

当然,在幕后,闭包是通过内部类实现的,所以如果你的观点是说闭包没什么神奇的,我们大多数人都会同意。

关于 Java 中的闭包和匿名类之间的区别,有一些重要的范围界定点需要注意,最显着的是对非最终变量的访问以及可配置的委托(delegate)策略。

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

def c=this.&doSomething

这将创建一个 MethodClosure,您将能够使用它来传输您的方法,并减少从类到方法的模块化的粒度。

所以我们开始偏离访客模式很远,不是吗?

我认为最终,根据我的理解,闭包是一种面向对象的方式,使方法成为一等公民,并获得函数式编程的好处。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com