1. 概要

このチュートリアルでは、Kotlinのコンストラクターについて詳しく見ていきます。

概念の簡単な要約から始めましょう。コンストラクターを使用してオブジェクトを作成します。 これらはメソッド宣言のように見えますが、常にクラスと同じ名前であり、何も返しません。

Kotlinプロジェクトのセットアップについては、入門チュートリアルをご覧ください。

Kotlinでは、クラスに1次コンストラクターと1つ以上の追加の2次コンストラクターを含めることができます。

次のセクションでは、各タイプと関連する概念について説明します。

2. プライマリコンストラクタ

Kotlinでオブジェクトを作成する最初の方法は、プライマリコンストラクターを使用することです。

これはクラスヘッダーの一部です。パラメーターは、クラス宣言の後に配置するクラスフィールドの場合もあります。

2つのプロパティと1つのプライマリコンストラクターを持つ基本的なクラス宣言を見てみましょう。

class Person constructor(val name: String, val age: Int? = null)

この例では、valキーワードを使用してプロパティを宣言しています。 これは通常の変数と同じように動作しますが、 val プロパティは読み取り専用です(Java final キーワードの対応物)。

後で参照を変更する場合は、代わりにvarキーワードを使用する必要があります。 ただし、プライマリコンストラクターのフィールドのタイプは明示的である必要があるため、省略できません。

場合によっては、コンストラクタキーワードを省略できます。これは、@Autowiredなどのアノテーションまたはprivateなどのアクセス修飾子を使用する場合にのみ必須です。 ]または保護された

また、コンストラクターでKotlinのデフォルトパラメーターを使用できます。

次に、プライマリコンストラクターをどのように使用できるかを見てみましょう。

val person = Person("John")
val personWithAge = Person("Mark", 22)

私たちはそれを見ることができますクラス名はコンストラクターの呼び出しです。 newキーワードを使用する必要はありません。

参考までに、Javaでコンストラクター宣言に相当するものも見てみましょう。

class PersonJava {
    final String name;
    final Integer age;

    public PersonJava(String name) {
        this.name = name;
        this.age = null;
    }

    public PersonJava(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

ご覧のとおり、Javaで同じ結果を得るには、さらに多くのコードが必要になります。

2.1. JVMのプライマリコンストラクタ

コンパイラーは、JVMにパラメーターなしで追加のコンストラクターを生成することに注意してください。 この目的のために、デフォルト値でオブジェクトをインスタンス化します。

このように、Kotlinは、no-argsコンストラクターを使用してクラスインスタンスを作成するJacksonやJPAなどのライブラリーとうまく連携できます。

class Person(val name: String = "")

3. コンストラクターパラメーターからのプロパティの初期化

クラス本体のプロパティ初期化子は、プライマリコンストラクターパラメーターを使用できます。

nameupperCaseNameプロパティに変換してみましょう。

class Person(val name: String, val age: Int? = null) {
    val upperCaseName: String = name.toUpperCase()
}

2番目のinitブロックを追加すると、コンソールに出力が表示されます。

init {
    println("Upper case name is $upperCaseName")
}

4. イニシャライザーブロック

プライマリコンストラクターにコードを入れることはできません。

ただし、初期化コードを実行しなければならない場合があります。 そのための適切な場所は、initキーワードが前に付いた初期化ブロックです。

イニシャライザブロックは、プライマリコンストラクタの後に呼び出されます。 この場所でクラスフィールドにアクセスすることもできます。

クラスには、1つ以上のinitブロックを含めることができます。

イニシャライザブロックをPersonクラスに追加しましょう。

init {
    println("Hello, I'm $name")        
    if (surname.isEmpty()) {
        throw IllegalArgumentException("Surname cannot be empty!")
    }
}

次に、 Person クラスオブジェクトを作成すると、コンソールに次のように表示されます。

Hello, I'm John

空のsurnameに対してIllegalArgumentExceptionをスローします。

init ブロックが多数ある場合、それらはクラス本体に表示されるのと同じ順序で実行されます。

5. 二次コンストラクタ

Kotlinクラスでは、1つ以上のセカンダリコンストラクターを宣言することもできます。セカンダリコンストラクターの前にコンストラクターキーワードを付けます。

class Car {
    val id: String
    val type: String

    constructor(id: String, type: String) {
        this.id = id
        this.type = type
    }
}

そして基本的な使用法:

fun main(args: Array<String>) {
    val car = Car("1", "sport")
    val suvCar = Car("2", "suvCar")
}

各セカンダリコンストラクターはプライマリコンストラクターに委任する必要があります。これはこのキーワードで行います。

プロパティをプライマリコンストラクタに移動し、セカンダリコンストラクタ:を変更してみましょう。

class Car(val id: String, val type: String) {
    constructor(id: String): this(id, "unknown")
}

6. コンストラクターと継承

スーパークラスのプライマリコンストラクターを使用できます。

Kotlinのすべてのクラスは、デフォルトで最終であることに注意してください。 つまり、 Person クラスから継承できるように、openキーワードを追加する必要があります。

Personクラスから継承するEmployeeクラスを追加しましょう。 どちらもプライマリコンストラクタを使用しています。

class Employee(name: String, val salary: Int): Person(name)

これにより、namePersonクラスのプライマリコンストラクターに渡します。 さらに、Employeeクラスにsalaryという新しいフィールドを追加します。

7. 結論

この簡単な記事では、Kotlin言語でコンストラクターを作成するさまざまな方法について説明しました。 希望に応じて、さまざまな方法でフィールドをインスタンス化できます。

すべての例の実装は、Githubプロジェクトにあります。

Kotlinの機能自体の詳細については、Kotlinの概要をご覧ください。