Groovy and Grails Recipes翻译之旅——第4章 面向对象的Groovy(1)

第4章          面向对象的Groovy(Object-oriented Groovy)

Groovy是一种成熟的面向对象语言,支持Java程序员所熟知的面向对象编程概念,如类(classes),对象(objects),接口(interfaces),继承(inheritance),多态性(polymorphism)等等。Groovy是纯面向对象语言,Groovy中一切都是对象。尽管您可使用Groovy编写脚本,但Groovy编译器最终把脚本转换为groovy.lang.Script类型的Java 类。

我不习惯把Groovy称为脚本语言,因为脚本通常与难控制的,非结构化,晦涩的代码相联系。您完全可按类和包的结构组织代码,也可嵌入脚本。Groovy的强大之处在于它的灵活性:您可按任何方式使用脚本和类进行混合编程。

4.1.           类与脚本的不同之处?

Java程序员一定非常熟悉类的概念,毕竟,任何Java代码都必须在类之中。Java中,一个文件中只能有一个公共类(public class),并且类名必须与文件名一致。

在代码组织方面,Groovy要比Java灵活得多。除了类,Groovy中还可编写脚本。存在类外的任何代码都被称为脚本(script)。当然,您可按任何方式使用脚本和类进行混合编程,并且同一文件中除了脚本代码外,仍可包括一个或多个类。不同于JavaGroovy中同一文件可包含多个公共类,类名也不需与文件名一致。接下来,本文将讨论在Groovy中所有可能的代码组织方式。

每个文件中只有一个公共类(One Public Class per File

Groovy文件可只包含一个公共类。除了编译文件使用groovyc命令,并且文件名与类名可以不一致外,其他都与在Java中一样,如清单4.1所示:

 

清单4.1 只有一个公共类的Groovy文件

//HelloWorld.groovy:

class HelloThere{

  def sayHello(){

        println ' Hello World '

  }

}

 

如果您使用groovyc命令编译该文件,编译器将生产一个HelloThere.class文件。

每个文件中有多个类(Multiple Class per File

Groovy文件可包含多个任何访问权限的类,如公共类,受保护类,或私有类等。同样,使用groovyc编译,类名不需与文件名一致,看清单4.2

 

清单4.2 一个Groovy文件包含2个公共类

 

//HelloWorld.groovy:

class HelloThere {

  String sayHello(){

    Echoer echoer = new Echoer()

      echoer.echo()

  }

}

class Echoer {

  String echo(){

    return 'Hello World'

  }

}

 

如果您使用groovyc命令编译,将生成2个文件:HelloWorld.classEchoer.class

只有脚本代码(Scripting Code Only

Groovy文件也可只存在脚本代码。同一般的Java类一样,您仍可使用groovyc进行编译,可使用groovy命令运行该文件。清单4.3给出一个资料,如:

 

清单4.3 Groovy脚本代码

 

//Script.groovy:

println 'Hello World'

 

使用groovyc命令编译该脚本,编译器将生产一个Script.class文件。

类与脚本共存一个文件中(Classes and Scripting Code in the Same File

Groovy文件可包含任何访问权限的类和脚本代码,如清单4.4所示。

 

清单4.4 Groovy文件包含2个类和脚本代码

//HelloWorld.groovy:

class HelloThere {

  String sayHello(){

    Echoer echoer = new Echoer()

      echoer.echo()

  }

}

class Echoer {

  String echo(){

    return 'Hello World'

  }

}

def helloThere = new HelloThere()

assert helloThere.sayHello() == 'Hello World'

 

使用groovyc编译会生成3个类:HelloThere.clasEchoer.classHelloWorld.class。您会注意到,公共类不需被显式声明为public,这是因为publicGroovy class缺省的访问权限。Groovy也支持其他的Java修饰符关键字:private, public, protected, static, transient, final, abstract, native, threadsafe, synchronized, volatilestrictfp

如果您把清单4.4Groovy文件命名为HelloThere.groovy,编译器会抛出重复类定义(duplicate class definitions)的错误。这是因为该文件中存在脚本代码。所以,编译器将为脚本代码生成一个类,缺省地该类名与文件名一致,即HelloThere,而文件中已经定义了一个类HelloThere,因此编译器会抛出重复类定义的异常。

选择一种代码组织方式(Choosing a Strategy)

代码组织的方式完全依靠您的喜好以及项目的要求。多数Java程序员刚开始倾向于第1种方式,即在一个Groovy文件中只声明一个公共类。

我更喜欢在一个Groovy文件中,声明一个公共类和一些只供该类调用的帮助类。除非绝对的需要,否则我会尽量避免将类和脚本代码混合在一起。 脚本是学习Groovy极好的途径,并在某些领域广泛应用,例如编写独立脚本或者Groovy嵌入到应用程序中起到插件的作用等。但是,我建议应避免在应用中包含太多脚本,因为脚本可重用性较差,并且随着脚本逐渐增加,原来程序的逻辑流程变得难以遵循混乱起来。

你可能感兴趣的:(编程,脚本,嵌入式,grails,groovy)