2009-06-03 3 views
3

В Груви типов являются необязательными, так что вы можете использовать либо:время компиляции в 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 компилятор любого типа -Проверка при указании типов?

Спасибо, Дон

ответ

2

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

3

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

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

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

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

+0

Новый InvokeDynamic в JDK 7 улучшит скорость Groovy. Большинство проблем производительности с динамическими языками JVM связаны с ограничениями, которые VM налагает на язык. Большинство вещей за кулисами с Java являются динамическими, это просто язык, который накладывает статические типы. – Joshua

+0

Да, и я не жаловался на скорость, просто объясняя. – billjamesdev

2

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

String foo = "foo" 
foo.noSuchMethod() 

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

String.metaClass.noSuchMethod { -> println "Yes there is such a method"} 
+0

Это также сложно проверить подписи. О единственном, что вы можете получить, это написание ключевых слов и согласование фигурных скобок. – billjamesdev

1

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

def foo 
foo.[ctrl-space] 

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

List foo 
foo.[ctrl-space] 

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

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

Смежные вопросы