Groovy中的编译时检查

时间:2009-06-03 18:33:58

标签: grails types

在Groovy中,类型是可选的,因此您可以使用:

String foo = "foo"
foo.noSuchMethod()

def foo = "foo"
foo.noSuchMethod()

我假设第一个示例会生成编译时错误,而第二个示例只会在运行时失败。但是,情况似乎并非如此。根据我的经验,两种情况都不会产生编译时错误。

我是否正确地假设声明引用类型的唯一好处是作为一种文档形式,即将意图传达给其他程序员。例如,如果我写一个方法,如:

def capitalize(String arg) {
    return arg.toUpperCase()
}

这比以下方式更有效地传递应该传递给函数的参数类型:

def capitalize(def arg) {
    return arg.toUpperCase()
}

当指定类型时,Groovy编译器是否执行任何类型检查?

谢谢, 唐

4 个答案:

答案 0 :(得分:3)

[编辑] 较新版本的Groovy允许编译时静态类型检查。使用此批注的代码比常规运行时Groovy更快,因为许多动态检查都被跳过。

正如Cesar所说,类型检查是一个运行时进程,这是Groovy比Java慢的主要原因之一(不是那个非常糟糕)。

你可以看出为什么会这样,对吧?鉴于Groovy的动态特性,几乎不可能判断String是否已经扩展到代码中的其他地方以包含方法noSuchMethod()。对于成员类型检查也是如此,因为完全可以删除一种类型的成员,并在代码中添加另一种类型的成员,其中同名。这可能不常见,但非常有可能。

问题是,您真正需要多少类型检查?你正在调用这个方法,你真的应该知道它需要什么参数,或者方法是否真的存在。使用编译时检查来节省查找时间并不是编译器的核心用途。

答案 1 :(得分:2)

在Groovy中,类型检查是在运行时动态完成的。类型变量的好处是你可以确定它包含你期望它们拥有的值,否则你会得到一个运行时异常,你可以抓住它并做你需要做的任何事情来处理异常。

答案 2 :(得分:2)

在Groovy中编译时间检查几乎不可能类型

的例子
String foo = "foo"
foo.noSuchMethod()

鉴于先前的指令是按照

的顺序执行的,所以会很好地工作
String.metaClass.noSuchMethod { -> println "Yes there is such a method"}

答案 3 :(得分:1)

您可以指定类型的一个原因是允许IDE帮助您。

def foo
foo.[ctrl-space]

...对你不会有什么帮助

List foo
foo.[ctrl-space]

...可能(取决于IDE)可以选择List的方法。当然,由于其他答案中给出的原因,不是其中一种选择的方法可能是有效的方法。

还有其他自动化软件维护操作可以从类型的线索中受益。例如,重构。