Groovy def

Groovy def

1. Visão geral

Neste tutorial rápido, vamos explorar o conceito da palavra-chavedef emGroovy. Ele fornece um recurso de digitação opcional para esse idioma dinâmico da JVM.

2. Significado da palavra-chavedef

A palavra-chavedef é usada para definir uma variável não digitada ou uma função no Groovy, pois é uma linguagem opcionalmente digitada.

Quando não temos certeza do tipo de uma variável ou campo, podemos aproveitardef para permitir que o Groovy decida os tipos em tempo de execução com base nos valores atribuídos:

def firstName = "Samwell"
def listOfCountries = ['USA', 'UK', 'FRANCE', 'INDIA']

Aqui,firstName será umString, elistOfCountries será umArrayList.

Também podemos usar a palavra-chavedef para definir o tipo de retorno de um método:

def multiply(x, y) {
    return x*y
}

Aqui,multiply pode retornar qualquer tipo de objeto, dependendo dos parâmetros que passamos para ele.

3. def Variáveis

Vamos entender comodef funciona para variáveis.

Quando usamosdef para declarar uma variável, Groovy a declara comoNullObjecte atribui um valornull a ela:

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

No momento em que atribuímos um valor alist, o Groovy define seu tipo com base no valor atribuído:

list = [1,2,4]
assert list instanceof ArrayList

Digamos que queremos ter nosso tipo de variável dinâmico e mudar com uma atribuição:

int rate = 20
rate = [12] // GroovyCastException
rate = "nill" // GroovyCastException

Não podemos atribuirList ouString a uma variável do tipoint, comothis will throw a runtime exception.

Portanto, para superar esse problema e invocar a natureza dinâmica do Groovy, usaremos a palavra-chavedef:

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. Métodosdef

A palavra-chavedef é usada posteriormente para definir o tipo de retorno dinâmico de um método. Isso é útil quando podemos ter diferentes tipos de valores de retorno para um método:

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

Também podemos usardef para definir um método sem retornos explícitos:

def greetMsg() {
    println "Hello! I am Groovy"
}

5. def vs. Type

Vamos discutir algumas das melhores práticas em torno do uso dedef.

Embora possamos usardef e digitar juntos ao declarar uma variável:

def int count
assert count instanceof Integer

A palavra-chavedef será redundante aqui, então devemos usardef ou um tipo.

Além disso, devemosavoid using def for untyped parameters em um método.

Portanto, em vez de:

void multiply(def x, def y)

Devemos preferir:

void multiply(x, y)

Além disso, devemosavoid using def when defining constructors.

6. Groovydef vs. JavaObject

Como vimos a maioria dos recursos da palavra-chavedef e seus usos por meio de exemplos, podemos nos perguntar se é semelhante a declarar algo usando a classeObject em Java. Sim,def can be considered similar toObject:

def fullName = "Norman Lewis"

Da mesma forma, podemos usarObject em Java:

Object fullName = "Norman Lewis";

7. def vs. @TypeChecked

Como muitos de nós seríamos do mundo das linguagens estritamente tipadas, podemos nos perguntarhow to force compile-time type checking in Groovy. Podemos fazer isso facilmente usando a anotação@TypeChecked.

Por exemplo, podemos usar@TypeChecked em uma classe para ativar a verificação de tipo para todos os seus métodos e propriedades:

@TypeChecked
class DefUnitTest extends GroovyTestCase {

    def multiply(x, y) {
        return x * y
    }

    int divide(int x, int y) {
        return x / y
    }
}

Aqui, a classeDefUnitTest será verificada por tipo ecompilation will fail due to the multiply method being untyped. O compilador Groovy exibirá um erro:

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

Então,to ignore a method, we can use TypeCheckingMode.SKIP:

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

8. Conclusão

Neste tutorial rápido, vimos como usar a palavra-chavedef para invocar o recurso dinâmico da linguagem Groovy e determinar os tipos de variáveis ​​e métodos em tempo de execução.

Essa palavra-chave pode ser útil para escrever código dinâmico e robusto.

Como de costume, as implementações de código deste tutorial estão disponíveis no projetoGitHub.