Является ли ключевое слово `def` необязательным? Если так, зачем его использовать? - PullRequest
1 голос
/ 18 марта 2020

Мне известно, что переменная может быть динамически набрана с помощью ключевого слова def в Groovy. Но я также заметил, что в некоторых случаях его можно не учитывать, например, при определении параметров метода, например, func(p1, p2) вместо func(def p1, def p2). Последняя форма не рекомендуется.

Я заметил, что она распространяется на весь код - в любое время, когда вы хотите определить переменную и установить ее значение, например, var = 2 ключевое слово def может быть безопасно опущено. Похоже, что это требуется только в том случае, если не создается переменная при создании, ie. def var1 чтобы его можно было создать как NullObject.

Это единственный раз, когда def полезен? Можно ли его безопасно исключить из всех других объявлений, например, классов и методов?

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Краткий ответ: Вы не можете . В некоторых случаях пропускается объявление типа (или ключевое слово def), но это не общее правило. Например, сценарии Groovy позволяют использовать переменные без указания типа c, например,

x = 10

Однако это работает, поскольку класс groovy.lang.Script реализует getProperty и setProperty методы, которые запускаются при доступе к отсутствующему свойству. В этом случае такая переменная считается глобальной связью, а не локальной переменной. Если вы попытаетесь сделать то же самое с любым другим классом, который не реализует эти методы, вы получите groovy.lang.MissingPropertyException.

Поддерживается пропуск типов в объявлении метода, как в динамически компилируемой, так и статически компилируемой Groovy. Но полезно ли это? Это зависит. В большинстве случаев гораздо лучше объявить тип для лучшей читаемости и целей документирования. Я бы не рекомендовал делать это в API publi c - пользователь вашего API увидит тип Object, в то время как вы можете ожидать некоторый конкретный тип c. Это показывает, что это может сработать, если вы хотите получить какой-либо объект, независимо от того, какой у него тип c. (Например, такой метод, как dump(obj), может так работать.)

И, наконец, что не менее важно, есть способ пропустить объявление типа в любом контексте. Для этого вы можете использовать ключевое слово final.

class Foo {
    final id = 1

    void bar(final name) {
        final greet = "Hello, "

        println greet + name + "!"
    }
}

Таким образом, вы можете получить код, который компилируется с динамической компиляцией c, а также с включенной компиляцией stati c. Конечно, использование ключевого слова final предотвращает повторное присвоение переменной, но для компилятора этой информации достаточно, чтобы вывести правильный тип.

Для получения дополнительной информации вы можете проверить аналогичный вопрос, который был спросил SO некоторое время go: Groovy: ключевое слово "def" против конкретного типа

1 голос
/ 18 марта 2020

in Groovy играет важную роль в Global и Local variable

, если имя переменной совпадает с def

* 1008 и без него * def считается локальным и без определения его global

Я подробно объяснил здесь { ссылка }

Итак если кто-то использует с этим и без него, это изменит ситуацию и может что-то изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...