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.