Groovy defキーワード

  • link:/category/programming/ [プログラミング]

  • Groovy

1. 概要

このクイックチュートリアルでは、https://www.baeldung.com/groovy-language [Groovy]の_def_キーワードの概念を探ります。 この動的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
}
ここで、_multiply_は、渡すパラメーターに応じて、任意のタイプのオブジェクトを返すことができます。

3. _def_変数

_def_が変数に対してどのように機能するかを理解しましょう。
_def_を使用して変数を宣言すると、Groovyはそれをhttp://docs.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/groovy/runtime/NullObject.html [ _NullObject_]に_null_値を割り当てます。
def list
assert list.getClass() == org.codehaus.groovy.runtime.NullObject
assert list.is(null)
_list_に値を割り当てると、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_キーワードはさらに、メソッドの動的な戻り型を定義するために使用されます。 これは、メソッドに異なるタイプの戻り値を設定できる場合に便利です。
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 int count
assert count instanceof Integer
  • _def_キーワードはそこで冗長になるので、_def_またはタイプを使用する必要があります。*

    さらに、メソッド内で型指定されていないパラメーターに_def_を使用しないようにする必要があります。
    したがって、代わりに:
void multiply(def x, def y)
私たちは好むべきです:
void multiply(x, y)
さらに、コンストラクタを定義するときに_def_を使用しないでください。*

6. Groovy def_vs。 Java _Object

_def_キーワードの機能のほとんどとその使用例を例で見てきたように、Javaで_Object_クラスを使用して何かを宣言することに似ているのではないかと思うかもしれません。 はい、* _ def_は* _ * Object * _と同様と見なすことができます。
def fullName = "Norman Lewis"
同様に、Javaで_Object_を使用できます。
Object fullName = "Norman Lewis";

7. def vs. _ @ 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_クラスの型チェックが行われ、* multiply_メソッドが型指定されていないため*コンパイルが失敗します*。 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言語の動的機能を呼び出し、実行時に変数とメソッドのタイプを決定する方法を説明しました。
このキーワードは、動的で堅牢なコードを書くのに便利です。
いつものように、このチュートリアルのコード実装はhttps://github.com/eugenp/tutorials/tree/master/core-groovy-2[GitHub]プロジェクトで利用できます。