`
scanfprintf123
  • 浏览: 80237 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy闭包中的this,owner和delegate

阅读更多

要想了解Groovy闭包中的this,owner和delegate的含义,首先我们需要知道闭包能在哪些上下文中进行创建。

 

创建闭包的上下文

 

首先,闭包可以在方法体中创建(类的实例方法或者静态方法均可)

 

class Person{
	
	def static method(){
		def methodClosure={
			println "methodClosure this:"+this
			println "methodClosure owner:"+owner
			println "methodClosure delegate:"+delegate
		}
		methodClosure
	}
}

Person.method().call()
 

输出:

 

 

methodClosure this:class test.Person

methodClosure owner:class test.Person

methodClosure delegate:class test.Person

 

其次, 闭包可以在类中直接定义:

 

 

class Person{
	def static classClosure={
		println "classClosure this:"+this
		println "classClosure owner:"+owner
		println "classClosure delegate:"+delegate
	}

}

Person.classClosure.call()
 

输出:

 

 

classClosure this:class test.Person

classClosure owner:class test.Person

classClosure delegate:class test.Person

 

再者,闭包可以在groovy的script中直接定义,实际上也是在类中直接定义,同上,因为groovy的script实际上会被编译为Script.class

 

 

def scriptClosure={
	println "scriptClosure this:"+this
	println "scriptClosure owner:"+owner
	println "scriptClosure delegate:"+delegate
}

scriptClosure.call()

 

输出:

 

 

scriptClosure this:test.Script@a09e41

scriptClosure owner:test.Script@a09e41

scriptClosure delegate:test.Script@a09e41

 

最后, 闭包可以在闭包中定义:

 

 

def closure={
	def closureClosure={
		println "closureClosure this:"+this
		println "closureClosure owner:"+owner
		println "closureClosure delegate:"+delegate
	}
	closureClosure.call()
}

closure.call()

 

输出:

 

 

closureClosure this:test.Script@27cd63

closureClosure owner:test.Script$_run_closure2@746ad0

closureClosure delegate:test.Script$_run_closure2@746ad0

 

从上可以看到,闭包可以在四种上下文中进行定义,但是闭包中的this,owner 和 delegate的含义却各不相同。 

 

 

静态闭包和实例闭包

实际上,闭包根据其创建的上下文不同,还可以分为静态闭包和实例闭包,在这两种情况下,this,owner和delegate的含义也是不同的。

 

class ClosureTest{
	def static classClosure={
		println "classClosure this:"+this
		println "classClosure owner:"+owner
		println "classClosure delegate:"+delegate
	}
	
	def instanceClosure={
		println "instanceClosure this:"+this
		println "instanceClosure owner:"+owner
		println "instanceClosure delegate:"+delegate
	}
	
	def static classMethodClosure(){
		def classMethodClosure={
			println "classMethodClosure this:"+this
			println "classMethodClosure owner:"+owner
			println "classMethodClosure delegate:"+delegate
		}
		classMethodClosure.call()
	}
	
	def  instanceMethodClosure(){
		def instanceMethodClosure={
			println "instanceMethodClosure this:"+this
			println "instanceMethodClosure owner:"+owner
			println "instanceMethodClosure delegate:"+delegate
		}
		instanceMethodClosure.call()
	}
}

ClosureTest.classClosure()
new ClosureTest().instanceClosure()
ClosureTest.classMethodClosure()
new ClosureTest().instanceMethodClosure()

 

输出:

 

classClosure this:class test.ClosureTest
classClosure owner:class test.ClosureTest
classClosure delegate:class test.ClosureTest
instanceClosure this:test.ClosureTest@11d3226
instanceClosure owner:test.ClosureTest@11d3226
instanceClosure delegate:test.ClosureTest@11d3226
classMethodClosure this:class test.ClosureTest
classMethodClosure owner:class test.ClosureTest
classMethodClosure delegate:class test.ClosureTest
instanceMethodClosure this:test.ClosureTest@ecb3f1
instanceMethodClosure owner:test.ClosureTest@ecb3f1
instanceMethodClosure delegate:test.ClosureTest@ecb3f1
 

 

This在闭包中的含义

 

对于this来讲,它基本上保持了跟java中this一样的含义(在java的静态方法以及静态域中,this是没有任何含义的),在上面的闭包创建的4种上下文中,实际上可以了解为只有2种,一种是在普通的类中定义,如上面的Person类,一种是在groovy script中定义,实际上也是在类中定义,只不过这个是一个比较特殊的类而已(Groovy会将groovy script编译为Script.class), 所以,this在闭包中的含义指的是,表示定义该闭包的类的实例对象(实例闭包)或者类本身(静态闭包)。

 

 

 

Owner在闭包中的含义

对于owner来讲,它的含义基本上跟this的含义一样,只是除了一种情况,如果该闭包是在其他的闭包中定义的,那么owner是指向定义它的闭包对象。 如上面最后一种创建上下文:

 

closureClosure owner:test.Script$_run_closure2@746ad0
 

Delegate在闭包中的含义

对于delegate来讲,它的含义大多数情况下是跟owner的含义一样,除非它被显示的修改(通过Closure.setDelegate()方法进行修改)。

 

在上面的几种创建上下文中,可以看到,如果闭包的delegate没有被显示改动的话,那么delegate确实是同owner是一个含义。下面我们看看修改delegate的情况:

 

 

def scriptClosure={
	println "scriptClosure this:"+this
	println "scriptClosure owner:"+owner
	println "scriptClosure delegate:"+delegate
}
println "before setDelegate()"
scriptClosure.call()
scriptClosure.setDelegate ("abc")
println "after setDelegate()"
scriptClosure.call()
 

 

输出:

 

 

before setDelegate()
scriptClosure this:test.Script@67c1a6
scriptClosure owner:test.Script@67c1a6
scriptClosure delegate:test.Script@67c1a6
after setDelegate()
scriptClosure this:test.Script@67c1a6
scriptClosure owner:test.Script@67c1a6
scriptClosure delegate:abc

 

其中,delegate可以被设置为任意一个对象。

 

 

下面可以看下groovy中使用了setDelegate的应用:

 

 

String.metaClass.doTestClosure={
	println "doTestClosure this:"+this
	println "doTestClosure owner:"+owner
	println "doTestClosure delegate:"+delegate
}
"do test".doTestClosure()


Integer.metaClass.doTestClosure={
	println "doTestClosure this:"+this
	println "doTestClosure owner:"+owner
	println "doTestClosure delegate:"+delegate
}
1.doTestClosure()

 

输出:

 

 

doTestClosure this:test.Script@ffeef1
doTestClosure owner:test.Script@ffeef1
doTestClosure delegate:do test
doTestClosure this:test.Script@ffeef1
doTestClosure owner:test.Script@ffeef1
doTestClosure delegate:1

 

可以看到,在通过metaClass动态添加方法时,delegate都被动态的设置为了调用者的实例本身,如上面的"do test"字符窜,以及整数1. 

 

setDelegate还被广泛的使用于groovy builder的构建中。有兴趣的可以看下groovy中BuildSupport的实现。

 

 

分享到:
评论

相关推荐

    groovy(10)-闭包委托策略1

    - 类`Preson2`的`fun()`方法中的闭包`classClouse`也遵循相同的规则,`this`指向`Preson2`的实例,而`owner`和`delegate`都是`Preson2`的实例。 理解闭包的这三个关键变量对于高效地利用Groovy的闭包功能至关重要。...

    closure闭包1

    - **委托链**:当在闭包中调用一个方法或访问属性,Groovy会检查 `this`、`owner` 和 `delegate`,按顺序寻找方法的实现。这使得闭包能够灵活地利用上下文中的方法。 6. **闭包的应用** - 闭包在Groovy中广泛应用...

    groovy入门经典,groovyeclipse 插件

    闭包的this指针在闭包内部指向创建它的上下文对象,而`@delegate`注解可以将闭包的未定义方法委托给外部对象处理。 函数式编程在Groovy中也得到了很好的支持,如列表和映射的操作。Groovy的列表支持链式操作,如`...

    [Groovy入门]第五讲.将流程控制语句与方法重构为闭包

    在学习Groovy的过程中,掌握闭包这一核心概念至关重要,尤其是在重构流程控制语句和方法时。本讲我们将深入探讨如何将传统的流程控制结构和方法转换为Groovy的闭包,以提高代码的可读性和可维护性。 首先,让我们...

    Z2-Groovy in Action.pdf

    Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它与Java语言无缝集成,同时提供了动态语言的许多特性,例如动态类型、闭包(closures)和元编程等。它由James Strachan于2003年首次提出,并迅速受到了社区的...

    groovy入门实例代码详细(包括字符串,map,闭包等等)

    在Groovy中,你可以感受到更强的表达性和更高的开发效率。本入门实例代码详细地涵盖了Groovy的一些核心概念和常用特性,包括字符串操作、Map的使用以及闭包等。 1. **字符串操作**: - Groovy中的字符串可以是单...

    groovy in action 中文版 2017.11

    在实际使用中,Groovy的集合类型和闭包都会有一些需要注意的地方,例如并发修改和副本与修改的语义区别。Groovy的设计模式支持也为开发者提供了实现常见设计模式的便利。例如,Groovy可以很自然地实现Visitor模式和...

    Groovy Script 入门

    3. **闭包支持**:闭包是Groovy的一个强大特性,它可以像对象一样被传递和存储,用于实现高级编程模式。 4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的...

    Groovy入门经典 中英文版本

    Groovy结合了脚本语言的便利性和静态类型的强类型语言的效率,使得它在Java生态系统中占据了一席之地。本书“Groovy入门经典”提供中英文双语版本,对于想要学习或深入了解Groovy的开发者来说,是一份非常宝贵的资源...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    Groovy学习笔记.pdf

    Groovy结合了Python、Ruby和Smalltalk等语言的特性,并与Java无缝集成,使得开发者可以在Java应用中充分利用Groovy的优势。 在开始Groovy的学习之前,首先要了解如何设置Groovy开发环境。这通常包括安装Java ...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    Groovy中文版教程

    这意味着你可以在同一个项目中混合使用Java和Groovy,方便地利用已有的Java资产。 6. ** Grape**:Grove的依赖管理工具Grape,可以自动下载并管理项目所需的库,类似于Java的Maven或Gradle。 7. **Grails**:...

    groovy-api-chm

    闭包有上下文(owner)和作用域,可以访问和修改这些环境中的变量。 5. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过MetaObjectProtocol (MOP) 实现的。例如,可以动态添加方法、属性,或者改变...

    groovy

    3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...

    Groovy在Spring中的简单使用

    Groovy 在 Spring 中的简单使用 Groovy 是一种敏捷的动态语言,用于 Java 虚拟机,可以与 Java 代码无缝集成。它的类 Java 语法对于 ...Groovy 在 Spring 中的使用可以提高开发效率和灵活性,且能够动态修改业务逻辑。

    Java调用Groovy,实时动态加载数据库groovy脚本

    本文将详细讲解如何在Java应用程序中调用Groovy脚本,实现从MongoDB数据库中读取并实时运行Groovy脚本,以及其背后的原理和优势。 首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享...

    Groovy中文教程

    Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java ...通过学习Groovy并掌握其在OFBiz中的应用,开发者可以提高开发效率,更灵活地处理业务需求,同时也为参与和贡献OFBiz项目提供了坚实的基础。

Global site tag (gtag.js) - Google Analytics