Существует ли "use strict" для Groovy?

Я помню из своих дней Perl выражение use strict", которое заставляет среду выполнения выполнять дополнительные проверки. Существует ли эквивалент для Groovy?

Мне не нравится быть укушенным во время выполнения тем, что можно обнаружить при компиляции, например, передать слишком мало аргументов конструктору.

Ответ 1

Groovy 2.0 теперь имеет необязательную проверку статического типа. Если вы помещаете аннотацию @groovy.transform.TypeChecked для класса или метода, groovy будет использовать строгие, типичные для Java правила статического ввода.

Кроме того, существует другая аннотация @groovy.transform.CompileStatic, которая аналогична, за исключением того, что она идет дальше и фактически компилирует ее без динамической типизации. Байт-код, сгенерированный для этих классов или методов, будет очень похож на прямую Java.

Эти аннотации могут применяться к отдельному классу или методу:

 import groovy.transform.TypeChecked

 @TypeChecked
 class MyClass {
      ...
 }

Вы также можете применить их глобально к целому проекту без добавления аннотаций к исходным файлам с конфигурацией компилятора script. Конфигурация script должна выглядеть примерно так:

withConfig(configuration)  {
    ast(groovy.transform.TypeChecked)
}

Запустите groovy или groovyc с помощью опции командной строки -configscript:

groovyc -configscript config.groovy MyClass.groovy

В руководстве groovy содержится дополнительная информация:

Ответ 2

Существует ли эквивалент для Groovy?

Не то, чтобы я знал.

Мне не нравится быть укушенным во время время выполнения, которое может быть обнаружено на компиляция, например, слишком мало аргументы конструктору.

Тогда Groovy, вероятно, является неправильным языком для вас, и вместо этого вы должны использовать что-то вроде Java или С#. В качестве альтернативы существует версия Groovy, известная как Groovy ++, которая имеет гораздо более сильную проверку типов, но я не считаю ее достаточно зрелой для использования в производстве.

IntelliJ (и, возможно, другие IDE) предоставляет множество предупреждений об изворотливом коде Groovy. Хотя эти предупреждения не препятствуют компиляции, они почти дают вам лучшее из обоих миров, то есть безопасность статического языка и гибкость динамического языка.

Ответ 3

Нет, такого не бывает, и быть не может. Perl "use strict" только предотвращает использование необъявленных переменных (и некоторые очень специфичные для Perl вещи, которые, как я думаю, не имеют эквивалентов в Groovy).

В динамических языках, таких как Groovy, "передача слишком мало аргументов конструктору" принципиально не то, что может обнаружить компилятор, потому что определения классов могут быть изменены во время выполнения посредством метапрограммирования. Кроме того, вы обычно не имеете информацию о типе, необходимую для того, чтобы знать, на какой класс посмотреть.

Если вам нужны максимальные проверки времени компиляции, используйте статически типизированный язык без метапрограммирования, т.е. Java.