Groovy and Grails Recipes翻译之旅——面向对象的Groovy(8)

4.8.           JavaGroovy字段与局部变量的不同之处?

变量是指存储变量值的内存地址(A variable is a name that refers to a location in memory that can store a value.)。就像Java一样,变量分为局部变量,它是在函数内部定义的变量;和全局变量,在程序执行的过程中一直有效,通常被称为字段(fields)。

Groovy中,变量可分为强制类型的,或非强制类型的。非强制类型变量(untyped variables)由def关键字定义,并被给定其Object静态类型,和一个由变量值决定的动态类型。变量必须先声明才能在类中使用,而脚本中则不需声明便可直接使用,因为这种情况下变量与该脚本的绑定对象相关联(绑定是一种数据存储,能完成从脚本获取数据或传给脚本数据等数据转移;a binding is a data store that enables transfer of data from and to the script)。声明变量意味着给定变量其一个类型(无论显式还是隐式的)或一个修饰符(如public, private, protected, static, final, transient等等),再或者两者结合。

清单4.21 展示了如何在Groovy中定义字段和变量。

 

清单4.21 Groovy中的字段和局部变量

class A {

  String typedField1, typedFiled2, typedFiled3

  public publicField1, publicFiled2, publicField3

  def untypedFiled

  static staticField

  final E = 'final field'

  def method(){

    def untypedLocal

    int typedLocal        

  }

}

boundVar = 'hi'

def methodInScript(){

  boundVar = 1

}

 

Groovy允许在同一行声明多个变量,且只需使用一个修饰符或类型。

下面代码在Groovy中是不正确的,您知道为什么吗?

class A{

         x = 1

}

是的,在A类中x只有被声明后才可使用。但是,下面脚本却是完全正确的:

//x.groovy

x = 1

assert x ==1

 

Groovy是一种类型安全语言,也就是说您不可以给变量赋予一个,否则就会抛出ClassCastException异常,如:

int x =1

new GroovyTestCase().shouldFail(ClassCastException.class){

  x = 'hi'

}

 

运行结果是这样的:

Result: "Cannot cast object 'hi' with class 'java.lang.String'

to class 'java.lang.Integer'

 

译者注:如果直接复制上述代码到脚本中,运行失败,这是因为GroovyTestCase会用到JUnit框架。如果要运行该例子,可参考第8Groovy代码测试。

 

Groovy提供了多种调用字段的方法。看下面的类A

 

class A {

  def count = 0

}

 

您可使用下面任一方法访问字段:

l  使用字段名

A a = new A()

a.count = 1

assert a.count == 1

l  使用下标操作符

A a = new A()

a['count'] = 1

assert a['count'] == 1

你可能感兴趣的:(框架,脚本,JUnit,grails,groovy)