1. 概要

このクイックチュートリアルでは、Groovydefキーワードの概念について説明します。 この動的JVM言語にオプションのタイピング機能を提供します。

2. defキーワードの意味

def キーワードは、オプションで型指定された言語であるため、型なし変数またはGroovyの関数を定義するために使用されます。

変数またはフィールドのタイプがわからない場合は、 def を利用して、割り当てられた値に基づいて実行時にGroovyにタイプを決定させることができます。

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

ここで、firstNameStringになり、listOfCountriesArrayListになります。

def キーワードを使用して、メソッドの戻り型を定義することもできます。

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

ここで、 multiply は、渡すパラメーターに応じて、任意のタイプのオブジェクトを返すことができます。

3. def変数

defが変数に対してどのように機能するかを理解しましょう。

def を使用して変数を宣言すると、Groovyはそれを 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またはStringint型付き変数に割り当てることはできません。これは、が実行時例外をスローするためです。

したがって、この問題を克服し、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対。 タイプ

defの使用に関するいくつかのベストプラクティスについて説明しましょう。

def の両方を使用して、変数を宣言するときに一緒に入力することもできます。

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オブジェクト

def キーワードのほとんどの機能とその使用法を例で見てきたので、JavaのObjectクラスを使用して何かを宣言するのと似ているのではないかと思うかもしれません。 はい、defはObjectと同様と見なすことができます。

def fullName = "Norman Lewis"

同様に、JavaでObjectを使用できます。

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 クラスは型チェックされ、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言語の動的機能を呼び出し、実行時に変数とメソッドのタイプを決定する方法を説明しました。

このキーワードは、動的で堅牢なコードを作成するのに便利です。

いつものように、このチュートリアルのコード実装はGitHubプロジェクトで利用できます。