1. Обзор
В этом кратком руководстве мы рассмотрим концепцию ключевого слова def
в Groovy . Он предоставляет дополнительную функцию ввода для этого динамического языка JVM.
2. Значение ключевого слова def
Ключевое слово def
используется для определения нетипизированной переменной или функции в Groovy, поскольку это язык с необязательной типизацией.
Когда мы не уверены в типе переменной или поля, мы можем использовать def
, чтобы позволить Groovy определять типы во время выполнения на основе присвоенных значений:
def firstName = "Samwell"
def listOfCountries = ['USA', 'UK', 'FRANCE', 'INDIA']
Здесь firstName
будет String
, а listOfCountries
будет ArrayList
.
Мы также можем использовать ключевое слово def
для определения возвращаемого типа метода:
def multiply(x, y) {
return x*y
}
Здесь умножение
может возвращать любой тип объекта, в зависимости от параметров, которые мы ему передаем.
3. переменные
определения
Давайте разберемся, как работает def
для переменных.
Когда мы используем def
для объявления переменной, Groovy объявляет ее как NullObject
и присваивает ей нулевое
значение:
def list
assert list.getClass() == org.codehaus.groovy.runtime.NullObject
assert list.is(null)
В тот момент, когда мы присваиваем значение списку
, Groovy определяет его тип на основе присвоенного значения:
list = [1,2,4]
assert list instanceof ArrayList
Допустим, мы хотим, чтобы тип нашей переменной был динамическим и изменялся с помощью присваивания:
int rate = 20
rate = [12] // GroovyCastException
rate = "nill" // GroovyCastException
Мы не можем присвоить List
или String
переменной типа int, так как это вызовет
исключение во время выполнения .
Итак, чтобы преодолеть эту проблему и задействовать динамическую природу Groovy, мы будем использовать ключевое слово def
:
def rate
assert rate == null
assert rate.getClass() == org.codehaus.groovy.runtime.NullObject
rate = 12
assert rate instanceof Integer
rate = "Not Available"
assert rate instanceof String
rate = [1, 4]
assert rate instanceof List
4. Методы
защиты
Ключевое слово def
далее используется для определения типа динамического возврата метода. Это удобно, когда у нас могут быть разные типы возвращаемых значений для метода:
def divide(int x, int y) {
if (y == 0) {
return "Should not divide by 0"
} else {
return x/y
}
}
assert divide(12, 3) instanceof BigDecimal
assert divide(1, 0) instanceof String
Мы также можем использовать def
для определения метода без явного возврата:
def greetMsg() {
println "Hello! I am Groovy"
}
5. защита
против типа
Давайте обсудим некоторые из лучших практик, связанных с использованием def
.
Хотя мы можем использовать как def
, так и type вместе при объявлении переменной:
def int count
assert count instanceof Integer
Ключевое слово def
будет здесь лишним, поэтому мы должны использовать либо def
, либо тип.
Кроме того, мы должны избегать использования def
для нетипизированных параметров в методе.
Поэтому вместо:
void multiply(def x, def y)
Мы должны предпочесть:
void multiply(x, y)
Кроме того, мы должны избегать использования def
при определении конструкторов.
6. Groovy def
против Java Object
Поскольку мы видели большинство возможностей ключевого слова def
и его использование в примерах, мы могли бы задаться вопросом, похоже ли это на объявление чего-либо с использованием класса Object в Java.
Да, def
можно считать похожим на Object
:
def fullName = "Norman Lewis"
Точно так же мы можем использовать Object
в Java:
Object fullName = "Norman Lewis";
7. Def
против @TypeChecked
Поскольку многие из нас были бы выходцами из мира строго типизированных языков, мы можем задаться вопросом , как принудительно выполнить проверку типов во время компиляции в Groovy . Мы можем легко добиться этого, используя аннотацию @TypeChecked
.
Например, мы можем использовать @TypeChecked
над классом, чтобы включить проверку типов для всех его методов и свойств:
@TypeChecked
class DefUnitTest extends GroovyTestCase {
def multiply(x, y) {
return x * y
}
int divide(int x, int y) {
return x / y
}
}
Здесь класс DefUnitTest
будет проверен на тип, и компиляция завершится ошибкой из-за нетипизированного метода умножения
. Компилятор Groovy выдаст ошибку:
[Static type checking] - Cannot find matching method java.lang.Object#multiply(java.lang.Object).
Please check if the declared type is correct and if the method exists.
Итак, чтобы игнорировать метод, мы можем использовать TypeCheckingMode.SKIP
:
@TypeChecked(TypeCheckingMode.SKIP)
def multiply(x, y)
8. Заключение
В этом кратком руководстве мы увидели, как использовать ключевое слово def
для вызова динамической функции языка Groovy и определения типов переменных и методов во время выполнения.
Это ключевое слово может быть удобно при написании динамического и надежного кода.
Как обычно, реализации кода этого руководства доступны в проекте GitHub .