代码之家  ›  专栏  ›  技术社区  ›  Dónal

Groovy中的编译时检查

  •  4
  • Dónal  · 技术社区  · 15 年前

    String foo = "foo"
    foo.noSuchMethod()
    

    def foo = "foo"
    foo.noSuchMethod()
    

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

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

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

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

    谢谢, 唐

    4 回复  |  直到 15 年前
        1
  •  3
  •   billjamesdev    10 年前

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

    你知道这是为什么吧?考虑到Groovy的动态特性,几乎不可能判断字符串是否已在代码中的其他地方扩展为包含noSuchMethod()方法。成员类型检查也是如此,因为完全可以删除一个类型的成员,然后使用

        2
  •  2
  •   Cesar    15 年前

    在Groovy中,类型检查是在运行时动态完成的。类型为的变量的好处是,您可以确保它包含您希望它们具有的值,否则您将得到一个运行时异常,您可以捕获该异常并执行任何您需要执行的操作来处理该异常。

        3
  •  2
  •   Robert Munteanu    15 年前

    在Groovy中进行编译时检查几乎是不可能的 对于类型 . 你的例子

    String foo = "foo"
    foo.noSuchMethod()
    

    String.metaClass.noSuchMethod { -> println "Yes there is such a method"}
    
        4
  •  1
  •   slim    14 年前

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

    def foo
    foo.[ctrl-space]
    

    List foo
    foo.[ctrl-space]
    

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