Kotlinコンストラクター
1. 概要
このチュートリアルでは、Kotlinのコンストラクターについて詳しく見ていきます。
概念の簡単な要約から始めましょう。コンストラクターを使用してオブジェクトを作成します。 これらはメソッド宣言のように見えますが、常にクラスと同じ名前であり、何も返しません。
Kotlinプロジェクトのセットアップについては、introductory tutorialをご覧ください。
Kotlinでは、クラスに1次コンストラクターと1つ以上の追加の2次コンストラクターを含めることができます。
次のセクションでは、各タイプと関連する概念について説明します。
2. プライマリコンストラクター
Kotlinでオブジェクトを作成する最初の方法は、プライマリコンストラクターを使用することです。
This is a part of the class header.パラメータはクラスフィールドでもあり、クラス宣言の後に置く。
2つのプロパティと1つのプライマリコンストラクターを持つ基本的なクラス宣言を見てみましょう。
class Person constructor(val name: String, val age: Int? = null)
この例では、val キーワードを使用してプロパティを宣言しています。 これは通常の変数と同じように動作しますが、valのプロパティは読み取り専用です(Javafinal keywordの対応物)。
後で参照を変更する場合は、代わりにvar キーワードを使用する必要があります。 ただし、これは明示的である必要があるため、プライマリコンストラクターのフィールドのタイプを省略することはできません。
In some cases, we can omit the constructor keyword.これは、@Autowiredなどの注釈またはprivateやprotectedなどのアクセス修飾子を使用する場合にのみ必須です。
また、コンストラクターでKotlinのデフォルトパラメーターを使用できます。
次に、プライマリコンストラクタを使用する方法を見てみましょう。
val person = Person("John")
val personWithAge = Person("Mark", 22)
a class name is a constructor invocation. There’s no need to use the new keyword.がわかります
参考までに、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は、引数なしのコンストラクターを使用してクラスインスタンスを作成するジャクソンや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キーワードのプレフィックスが付いた初期化ブロックです。
The initializer block is called after the primary constructor. この場所のクラスフィールドにもアクセスできます。
クラスは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つ以上のセカンダリコンストラクタ.Secondary constructors are prefixed with the 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) {
val car = Car("1", "sport")
val suvCar = Car("2", "suvCar")
}
Each secondary constructor has to delegate to the primary constructor.これはthis keywordで行います。
プロパティをprimary constructorに移動し、secondary constructor:を変更してみましょう
class Car(val id: String, val type: String) {
constructor(id: String): this(id, "unknown")
}
6. コンストラクタと継承
スーパークラスのプライマリコンストラクターを使用できます。
Kotlinのすべてのクラスはデフォルトでfinal であることに注意してください。 つまり、Personクラスから継承できるように、open キーワードを追加する必要があります。
Person classから継承するEmployeeクラスを追加しましょう。 どちらもプライマリコンストラクターを使用しています。
class Employee(name: String, val salary: Int): Person(name)
これを行うことにより、name をPerson classのプライマリコンストラクターに渡します。 さらに、Employeeクラスにsalaryという新しいフィールドを追加します。
7. 結論
この簡単な記事では、Kotlin言語でコンストラクターを作成するさまざまな方法について説明しました。 希望に応じて、さまざまな方法でフィールドをインスタンス化できます。
すべての例の実装はthe Github projectにあります。
Kotlinの機能自体の詳細については、introduction to Kotlinをご覧ください。