проверка во время компиляции в Groovy - PullRequest
4 голосов
/ 03 июня 2009

В 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 ]

3 голосов
/ 04 июня 2009

[Редактировать] Более новые версии Groovy допускают статическую проверку типов во время компиляции. Код, использующий эту аннотацию, работает быстрее, чем обычный Groovy, поскольку многие динамические проверки пропускаются.

Как сказал Сезар, проверка типов - это процесс во время выполнения, одна из основных причин того, что Groovy медленнее, чем Java (не то чтобы это действительно плохо).

Вы можете понять, почему это так, верно? Учитывая динамический характер Groovy, почти невозможно определить, было ли String расширено где-то еще в вашем коде, чтобы оно содержало метод noSuchMethod (). То же самое относится и к проверке типов элементов, поскольку вполне возможно удалить элемент одного типа и добавить элемент другого типа с с таким же именем позже в коде. Это, вероятно, не часто, но очень возможно.

Вопрос в том, сколько проверки типа вам действительно нужно? Вы вызываете метод, вы действительно должны знать, какие аргументы он принимает, или метод действительно существует. Использование проверки во время компиляции для экономии времени поиска не является основной полезностью компилятора.

2 голосов
/ 06 июня 2009

Проверка времени компиляции в Groovy близка к невозможной для типов . Ваш пример

String foo = "foo"
foo.noSuchMethod()

Прекрасно сработало бы, если бы ранее инструкция выполнялась в соответствии с

String.metaClass.noSuchMethod { -> println "Yes there is such a method"}
2 голосов
/ 04 июня 2009

В Groovy проверка типов выполняется динамически во время выполнения. Преимущество переменных с типом заключается в том, что вы можете быть уверены, что оно содержит ожидаемое ими значение, в противном случае вы получите исключение времени выполнения, которое вы можете перехватить и сделать все, что вам нужно для обработки исключения.

1 голос
/ 17 ноября 2009

Одна из причин, по которой вы можете указать тип, - разрешить IDE помочь вам.

def foo
foo.[ctrl-space]

... вам не очень поможет

List foo
foo.[ctrl-space]

... может (в зависимости от IDE) предоставить вам выбор методов List. Конечно, метод, который не является одним из вариантов, может быть правильным для использования по причинам, указанным в других ответах.

Существуют и другие автоматизированные операции по обслуживанию программного обеспечения, в которых используются подсказки о типах. Например, рефакторинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...