«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 для переменных.

Когда мы используем def для объявления переменной, Groovy объявляет ее как NullObject и присваивает ей нулевое значение:

def list
assert list.getClass() == org.codehaus.groovy.runtime.NullObject
assert list.is(null)

В тот момент, когда мы присваиваем значение списку, Groovy определяет его тип на основе присвоенного value:

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 далее используется для определения динамического возвращаемого типа. метода. Это удобно, когда у нас могут быть разные типы возвращаемых значений для метода:

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 vs. Type ~~ ~ Давайте обсудим некоторые из лучших практик, связанных с использованием def.

Хотя мы можем использовать и def, и type вместе при объявлении переменной:

Ключевое слово def будет здесь избыточным, поэтому мы должны использовать либо def, либо тип.

def int count
assert count instanceof Integer

Кроме того, мы должны избегать использования def для нетипизированных параметров в методе.

Поэтому вместо:

Мы должны предпочесть:

void multiply(def x, def y)

Кроме того, мы должны избегать использования def при определении конструкторов.

void multiply(x, y)

6. Groovy def против Java Object

Поскольку мы уже видели большинство возможностей ключевого слова def и его использование в примерах, мы можем задаться вопросом, похоже ли это на объявление чего-либо с использованием класса Object в Java. Да, def можно считать похожим на Object:

Точно так же мы можем использовать Object в Java:

def fullName = "Norman Lewis"

7. def против @TypeChecked

Object fullName = "Norman Lewis";

Как и многие из нас в этом мире языков со строгой типизацией, мы можем задаться вопросом, как заставить Groovy проверять типы во время компиляции. Мы можем легко добиться этого, используя аннотацию @TypeChecked.

Например, мы можем использовать @TypeChecked для класса, чтобы включить проверку типов для всех его методов и свойств: метод не типизирован. Компилятор Groovy отобразит ошибку:

Итак, чтобы игнорировать метод, мы можем использовать TypeCheckingMode.SKIP:

@TypeChecked
class DefUnitTest extends GroovyTestCase {

    def multiply(x, y) {
        return x * y
    }
    
    int divide(int x, int y) {
        return x / y
    }
}

8. Заключение

[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.

В этом кратком руководстве мы увидели, как использовать ключевое слово def для вызова динамической функции языка Groovy и определения типов переменных и методов во время выполнения.

@TypeChecked(TypeCheckingMode.SKIP)
def multiply(x, y)

Это ключевое слово может быть удобно при написании динамического и надежного кода.

Как обычно, реализации кода этого руководства доступны в проекте GitHub.

«

As usual, the code implementations of this tutorial are available on the GitHub project.