KotlinでAndroid開発!クラスを使いこなす


Kotlinというプログラミング言語を用いたAndroid開発が注目を集めています。
まずはKotlinの基本的な構文を知らないと始まらないのでJavaとの違いを押さえつつ確認していきましょう!

今回はクラスについてです。

クラス

Kotlinではクラス宣言、およびインスタンス化は次のように行います。

class User(name: String) {
    val name: String = name
}

//インスタンス化
val user = User("Alice")

クラス名の後に続く(…)はプライマリコンストラクタと呼ばれます。
インスタンス化する際にはこのコンストラクタを呼ぶことになります。

プロパティ初期化以外の処理を行いたい場合は次のようにinitブロックを使えばOK。

class User(name: String) {
    val name: String = name
    
    init {
        print("初期化を行いました")
    }
}

セカンダリコンストラクタ

複数のコンストラクタを用いたい場合はセカンダリコンストラクタを用います。
次のようにconstructorキーワードを使います。constructorは複数宣言できます。

class User(name: String) {
    val name: String = name

    constructor(name: String, age: Int): this(name) {
    }
}

セカンダリコンストラクタはプライマリコンストラクタを必ず呼ぶ必要があります。
上の例におけるthis(name)の部分がそれです。

プロパティ

Kotlinにクラスメンバ変数は全てプロパティです。
プロパティへのアクセスは次のように記述できます。

val user = User("Alice")
print(user.name)

Java的にみるとpublicなフィールドを直接触っているようですが、内部的に作られているアクセサメソッドを経由しています。
ですので直感的に書けながら安全性を破壊するものではありません。

readonlyのプロパティ(Java的に言えばgetteのみ)にしたい場合はval、変更可の場合はvarを用いて宣言します。

privateなフィールドとpublicなgetter/setterを用いることが標準プラクティスになっているJavaに比べて簡潔に書けていいですね。

また、コンストラクタの処理がプロパティにセットの場合、次のように書くことでプロパティの宣言を省略できます。

class User(val name: String)

データクラス

データ保持のためだけにクラスを定義する場合はよくありますよね。
そのようなクラスを宣言する際にKotlinのデータクラスという仕組みを用いると何かと便利です。

data class User(val name: String, val age: Int)

dataキーワードをつけてクラスを宣言します。
データクラスは、
プライマリコンストラクタに少なくとも一つのプロパティ宣言があること、
プライマリコンストラクタの引数は全てvalかvarをつけること
が必要です。

データクラスは次のようなメソッドが、プライマリコンストラクタをもとに自動的に付与されます。

  • equals()/hashCode()
  • User(name=John, age=42)のような値を返すtoString()
  • 宣言順にプロパティの値を返すcomponentN()
  • 別のインスタンスを作るcopy()

toString()は特に問題ないと思うので、他の三つについて補足します。

プロパティの値が等しければequalsメソッドはtrueを返します。

val user = User("Alice", 18)
val user2 = User("Alice", 18)

println(user.equals(user2)) //true

次のようにN(プロパティを宣言した順を表す自然数)を指定してプロパティの値を返すのがcomponentN()です。

println(user.component1()) //->Alice
println(user.component2()) //->18

copy()は一部のプロパティの値を変えて別のオブジェクトを作りたいときに便利です。

data class Book(val title:String, val author: String, val version: Int)

val book = Book("Tech", "pjin", 2)
val olderBook = book.copy(version = 1)
println(olderBook.toString()) //->Book(title=Tech, author=pjin, version=1)

このように変更したいプロパティだけ引数に与えることで他のプロパティの値はそのままの別のオブジェクトが生成されます。


Kotlinの基本的なクラスの使い方を解説しました。
Kotlinのクラスには他にSealed ClassやDelegetion(委譲)などプログラムをよりシンプルに書くための仕組みが用意されています。
それらについては別の機会に扱いたいと思います。

 

  • このエントリーをはてなブックマークに追加

PAGE TOP