Python中,文件是一个模块,可以包含多个类、函数或者普通语句,但Groovy采用了与Java一样的机制,即一个文件对应一个类,
具体的实现机制如下:(主要参考了 Groovy in Action : page:190)
在Groovy中类和文件的对应关系并不像Java中那么固定(Java中一个文件只能有一个声明为public的类和其他一些非公共的类和内嵌类) 。在同一个groovy文件中可以包含多个public的类定义。具体规则如下:
-
纯脚本:如果在一个groovy文件中没有任何类定义,它将被当做script来处理,也就意味着这个文件将被透明的转换为一个Script类型的类,这个类的类名是脚本的文件名(不含扩展名和包名,在default包中)。groovy文件的内容被打包进run方法,另外在新产生的类中被加入一个main方法使外部代码可以执行该脚本;
-
纯类(类名是文件名):如果在groovy文件正好有一个类的定义,并且该类的名字与文件名称相同,那么这就和java中的类与文件的一一对应关系相同。在一个groovy文件中可以包含多个不同可见性的类定义,并且没有强制性的要求其中有一个类的类名与文件名相同。groovyc编译器会很乐于把该文件中定义的所有的类都编译成*.class文件。如果你希望能够直接调用这个groovy script,比如说在使用groovy命令行或者在某个IDE中执行,那么你应该在该文件中的第一个类中定义一个main方法;
-
脚本/类混合:在一个groovy文件中可以混合类的定义和脚本定义。在这种情况下,那些脚本代码将会放入默认存在的主类(文件名类)的run方法,所以在这种情况下你不应该再定义一个和文件同名的类,否则会出现“类重复定义”错误。反过来说,如果显式地定义了主类,则主类之外,除了定义其他类,不能有任何其他脚本代码(包括语句和函数);