1.概要

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

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

Kotlinプロジェクトの設定については、https://www.baeldung.com/kotlin[Introduction tutorial]をご覧ください。

Kotlinでは、クラスは一次コンストラクタと一つ以上の追加の二次コンストラクタを持つことができます。

次のセクションでは、それぞれの種類とそれに関連する概念について説明します。

2.一次コンストラクタ

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

  • これはクラスヘッダの一部です** パラメータはクラスフィールドであるかもしれません。

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

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

この例では、

__ val

__キーワードでプロパティを宣言しています。

これは通常の変数と同じように振る舞いますが、

val

プロパティは読み取り専用であるという言及があります(Java

__final

__keyword相当物)。

後で参照を変更したい場合は、代わりに

__var

__キーワードを使用してください。ただし、これは明示的である必要があるため、プライマリコンストラクタではフィールドの種類を省略することはできません。

  • 場合によっては、

    __コンストラクタ

    __キーワードを省略することができます。

また、コンストラクタで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は、クラスインスタンスを作成するために引数なしのコンストラクタを使用するJacksonやJPAなどのライブラリとうまく連携することができます。

class Person(val name: String = "")

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

  • クラス本体からのプロパティ初期化子は一次コンストラクタパラメータを使用することができます。


__name




upperCaseName__プロパティに変換しましょう。

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

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

5.二次コンストラクタ

Kotlinクラスでは、1つ以上の二次コンストラクタを宣言することもできます

__.



二次コンストラクタの前には



constructor

__keyword が付きます。

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")
}

  • 各二次コンストラクタは、一次コンストラクタに委任する必要があります

    __.


    ** これは、


    this

    __キーワードで行います。

私たちのプロパティを

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

に移動し、__セカンダリコンストラクタを変更しましょう:

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

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

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

Kotlinのすべてのクラスはデフォルトで最終的なものです。これは、

Person

クラスから継承できるように、

__ open

__キーワードを追加する必要があることを意味します。


__Person


classから継承する

Employee__クラスを追加しましょう。

どちらもプライマリコンストラクタを使用しています。

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

こうすることで、

__ name





Person


classのプライマリコンストラクタに渡します。さらに、

Employee

クラスに

salary__という新しいフィールドを追加します。

7.まとめ

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

私たちのすべての例の実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[the Github project]にあります。

Kotlinの機能自体の詳細については、https://www.baeldung.com/kotlin[Kotlinの紹介]をご覧ください。