且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-01 09:22:42

更多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 

运行效果
BeanShell作用域范围修饰符this、super和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 ); 

运行效果
BeanShell作用域范围修饰符this、super和global
在上面的例子中我们使用了一个全局的对象来保持一些状态,而不是将“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() 

运行效果
BeanShell作用域范围修饰符this、super和global


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