BeanShell作用域范围修饰符this、super和global

简介:

更多BeanShell内容请点击此处

到目前为止,我们已经看到方法是如何嵌套、如何被看做对象的,那么我们可以重新回顾变量作用域范围以及作用域范围的修饰符。

“this”,“super”和“global”
在 “脚本方法”部分我们将“super”的使用描述成是指向一个方法的父范围(该方法被定义的范围)。而且在之前的部分中我们讨论了“super”的兄弟 “this”,“this”指向的是当前方法的范围,允许我们把一个方法的范围想成一个对象。现在我们可以看到这些概念是如何关联起来的。任何方法的范 围,事实上“global”范围,都可以被看做一个对象的上下文。一个脚本对象可以被看作封装在一个父范围,该范围决定它的“环境”——它继承变量和方 法。

”this“、“super”和“global”都是同种类型的引用——引用到 BeanShell 方法的上下文,可以被用作脚本对象。从这里开始我们将用“this”,“super”和“global”以及其他的引用指向一个脚本对象的上下文,通常就 像“this”类型的引用。
示例代码

 
  1. 注意: 
  2.  
  3. 如果你打印一个“this”类型的引用,你将会看到它指向那个对象: 
  4.  
  5.  
  6. BeanShell 1.3 —— by Pat Niemeyer (pat@pat.net) 
  7. bsh % print( this ); 
  8. 'this' reference (XThis) to Bsh object: global 
  9. bsh % foo() { print(this); print(super); } 
  10. bsh % foo(); 
  11. 'this' reference (XThis) to Bsh object: foo 
  12. 'this' reference (XThis) to Bsh object: global 

运行效果

上面的便签显示了foo()方法的“this”引用是本地的(叫做“foo”),而且它的父范围属于global;就是和foo定义的范围一样。

global
范 围修饰符“global”始终允许你指向最顶层的范围。在之前的便签中你可以看到最顶层的脚本范围是“global”并且它再次作为foo()方法的 “super”出现。全局的上下文常常是脚本范围的最顶层。它是当前解释器的全局命名空间。简单地从顶层范围指向“super”再次返回同样的 “global”。

 
  1. global.foo = 42; 

总之全局变量不是很特别。事实上它们的可见性源于它们位于最顶层。然而,对于那些不喜欢什么都使用“global”的你可以随时采用更多面向对象的方法,如下所示。
示例代码

 
  1. // 创建一个顶层对象来保持这些状态 
  2. dataholder = object(); 
  3. foo() { 
  4.   ... 
  5.   bar() { 
  6.     dataholder.value = 42; 
  7.   } 
  8.   bar(); 
  9.   print( dataholder.value ); 

运行效果

在上面的例子中我们使用了一个全局的对象来保持一些状态,而不是将“value”变量直接放置在全局的范围里。

注意:

在上面的例子中我们使用了 BeanShell  object() 命令来创建一个“空”的 BeanShell 脚本对象的上下文来保持一些

数据。object() 命令仅仅是一个标准的空方法,叫做 object() 返回“this”。变量“dataholder”上是一个“this”类型的

引用而且拥有所有任何其他 BeanShell 对象范围内的属性。

再看同步方法
现在我们已经了解了 BeanShell 方法中“this”和“super”的含义,那么我们就可以为 BeanShell 方法定义“同步的”修饰符的含义了。同步的 BeanShell 方法表现得就像通过同步它们共同的“super”引用的对象让它们在一个公共的类里。比如,在下面例子中的四种情况里同步发生在同一个 Java 对象上。这个对象是全局范围里“this”类型的引用。(一个 BeanShell 里 bsh.This 类型的对象)

示例代码

 
  1. print( this ); // 'this' reference (XThis) to Bsh object: global 
  2. // 下面的情况都同步在同一个锁上 
  3. synchronized ( this ) { } // 同步代码块 
  4. synchronized int foo () { } // 同步方法 foo() 
  5. synchronized int bar () { } // 同步方法 bar() 
  6. int gee() { 
  7.   synchronized( super ) { } // 代码块内部的同步 gee() 

运行效果


本文转自 tongqiuyan  51CTO博客,原文链接:http://blog.51cto.com/tongqiuyan/759022


相关文章
|
23天前
|
安全 编译器 程序员
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
111 3
|
2月前
register定义变量
register定义变量。
13 0
|
3月前
|
存储 缓存 编译器
learn_C_deep_2 (作用域和生命周期、局部变量和全局变量、最宽宏大量的关键字 - auto、最快的关键字 - register)
learn_C_deep_2 (作用域和生命周期、局部变量和全局变量、最宽宏大量的关键字 - auto、最快的关键字 - register)
【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
177 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
137 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
120 0
【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(一)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(一)
146 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
141 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
91 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
178 0
【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )