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

本文深入探讨了BeanShell中的变量作用域,包括this、super和global的概念及其应用,并介绍了同步方法的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值