Kotlinコンストラクター
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)
私たちはそれを見ることができます
参考までに、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. コンストラクターパラメーターからのプロパティの初期化
クラス本体のプロパティ初期化子は、プライマリコンストラクターパラメーターを使用できます。
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 ブロックが多数ある場合、それらはクラス本体に表示されるのと同じ順序で実行されます。
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)
これにより、nameをPersonクラスのプライマリコンストラクターに渡します。 さらに、Employeeクラスにsalaryという新しいフィールドを追加します。
7. 結論
この簡単な記事では、Kotlin言語でコンストラクターを作成するさまざまな方法について説明しました。 希望に応じて、さまざまな方法でフィールドをインスタンス化できます。
すべての例の実装は、Githubプロジェクトにあります。
Kotlinの機能自体の詳細については、Kotlinの概要をご覧ください。