Перейти к основному содержимому

Ключевое слово Groovy Def

· 4 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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 .