日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

發布時間:2025/6/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、閉包的代理策略引入
  • 二、閉包的四種代理策略





一、閉包的代理策略引入



分別在 Groovy 腳本 和 Test 類中定義 fun 方法 , 打印不同的內容 ;

在閉包 Closure 中分別調用上述兩個方法 ,


代碼示例 :

// I. 閉包中執行 Groovy 腳本中的方法def fun() {println "fun" }def closure = {fun() }closure()// II. 閉包中執行 Test 類中的方法class Test {def fun() {println "fun2"} }// 閉包中不能直接調用 Test 對象中的方法 // 此時可以通過改變閉包代理進行調用 def closure2 = {fun() }// 設置閉包的代理 closure2.delegate = new Test() // 執行閉包 closure2()

上述代碼執行結果 :

執行上述代碼后 , 兩個閉包都執行的是 Groovy 腳本中的 fun 方法 ;

即使 closure2 閉包設置的是 Test 實例對象作為代理 , 其仍然執行的是 Groovy 腳本中的 fun 方法 ;

// 設置閉包的代理 closure2.delegate = new Test()

這是因為 Closure 閉包的 代理策略問題導致的 ;

在 Closure 閉包中 , resolveStrategy 成員配置的是該閉包的代理策略 , 默認的代理策略 OWNER_FIRST , 也就是優先從 owner 中查找方法 ; 此時即使在 delegate 中有 fun 方法 , 也會被 owner 中的 fun 方法覆蓋 ;

private int resolveStrategy = OWNER_FIRST;



二、閉包的四種代理策略



閉包的四種代理策略 :

  • OWNER_FIRST : 所有者中的方法優先 ;
  • DELEGATE_FIRST : 代理優先策略 , 代理中的方法優先 ;
  • OWNER_ONLY : 只執行所有者中的方法 ;
  • DELEGATE_ONLY : 只執行代理中的方法 ;
  • TO_SELF : 只在自身查找 ;
public abstract class Closure<V> extends GroovyObjectSupport implements Cloneable, Runnable, GroovyCallable<V>, Serializable {/*** 設置此resolveStrategy后,閉包將首先嘗試將屬性引用和方法解析給所有者,* 然后是委托(<b>這是默認策略)。** For example the following code :* <pre>* class Test {* def x = 30* def y = 40** def run() {* def data = [ x: 10, y: 20 ]* def cl = { y = x + y }* cl.delegate = data* cl()* println x* println y* println data* }* }** new Test().run()* </pre>* will output :* <pre>* 30* 70* [x:10, y:20]* </pre>* 因為在測試類中聲明的x和y字段在委托中定義了變量<p> * <i>請注意,總是首先查找局部變量,而與解析策略無關。</i>*/public static final int OWNER_FIRST = 0;/*** 設置此resolveStrategy后,閉包將首先嘗試將屬性引用和方法解析為委托,然后解析為所有者。** 例如,以下代碼:* <pre>* class Test {* def x = 30* def y = 40** def run() {* def data = [ x: 10, y: 20 ]* def cl = { y = x + y }* cl.delegate = data* cl.resolveStrategy = Closure.DELEGATE_FIRST* cl()* println x* println y* println data* }* }** new Test().run()* </pre>* will output :* <pre>* 30* 40* [x:10, y:30]* </pre>* 因為在測試類中聲明的x和y字段在委托中定義了變量<p> * <i>請注意,總是首先查找局部變量,而與解析策略無關。</i>*/public static final int DELEGATE_FIRST = 1;/*** 使用此resolveStrategy集,閉包將只解析所有者的屬性引用和方法,而不調用委托。* 例如,以下代碼:** <pre>* class Test {* def x = 30* def y = 40** def run() {* def data = [ x: 10, y: 20, z: 30 ]* def cl = { y = x + y + z }* cl.delegate = data* cl.resolveStrategy = Closure.OWNER_ONLY* cl()* println x* println y* println data* }* }** new Test().run()* </pre>** 將拋出“No-this-property:z”錯誤,因為即使在委托中聲明了z變量,也不會進行查找<p> * <i>請注意,總是首先查找局部變量,而與解析策略無關</我>*/public static final int OWNER_ONLY = 2;/*** 使用此resolveStrategy集,閉包將只解析委托的屬性引用和方法,并完全繞過所有者。* 例如,以下代碼:** <pre>* class Test {* def x = 30* def y = 40* def z = 50** def run() {* def data = [ x: 10, y: 20 ]* def cl = { y = x + y + z }* cl.delegate = data* cl.resolveStrategy = Closure.DELEGATE_ONLY* cl()* println x* println y* println data* }* }** new Test().run()* </pre>** 將引發錯誤,因為即使所有者聲明了“z”字段,解析策略也將繞過所有者中的查找<p> * <i>請注意,總是首先查找局部變量,而與解析策略無關</i>*/public static final int DELEGATE_ONLY = 3;/*** 使用此resolveStrategy集,閉包將解析自身的屬性引用,* 并執行通常的元類查找過程。* 這意味著屬性和方法既不能從所有者也不能從委托解析,* 只能在閉包對象本身上解析。* 這允許開發人員使用閉包本身的ExpandoMetaClass覆蓋getProperty。<p>* <i>請注意,總是首先查找局部變量,與解析策略無關。</i>*/public static final int TO_SELF = 4;private int resolveStrategy = OWNER_FIRST; }

總結

以上是生活随笔為你收集整理的【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。