Kotlin クラスと Java クラス
Kotlin の話をする前に、まず Java の場合どうだったか説明します。
もし、Java もサッパリ知らない、という人には対比されても役に立たないと思うので、少し下まですっ飛ばして読んでください。 「Java 入門」も参考にしてください。
Java との比較から。Java の典型的なコード
Java で com.company.test パッケージに、name プロパティ1つをもつ Person クラスを定義してみましょう。 典型的な実装は、com.company.test/Person.java というファイルに、次のようになるでしょう。
package com.company.test; public class Person { String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
内部メンバーとして String 型の name をもち、 それをコンストラクタ Person で受け取った name で初期化。
そして、その値を利用する場合は、getter となる getName() メソッドで読み取ります。 値を再設定する場合は setter となる setName メソッドを通して name を更新します。
この Person クラスを利用する側は次のようになります。
package com.company; import com.company.test.*; public class Main { public static void main(String[] args) { Person p = new Person("Java Taro"); System.out.println("Hello, " + p.getName() + "!"); } }
実行結果は次の通りです。
Hello, Java Taro!
Kotlin の場合
上記の Java のコードと同様の内容は、Kotlin では次のようになります。
Person クラスは、test パッケージに作るとすると、test/Person.kt として次のようになります。
package test class Person(var name: String)
宣言部分を切り出したわけではありません。これで全てです。
Kotlin では、ファイル名と定義するクラス名を必ずしも同じにしないといけないわけではありませんが、 ここでは同じ名前にしています。詳しくは「パッケージとインポート」をみてください。
さらに、この Person クラスを利用する側のコードは次のようになります。
import test.* fun main() { val p = Person("Kotlin Taro") println("Hello, ${p.name}!") }
実行結果は次の通りです。たったこれだけのコードですが、ちゃんと動きます。
Hello, Kotlin Taro!
必ずしもコードが短ければ短いほど良い、というつもりもありませんが、同様のことが簡潔に記述できていますね。
近年のトレンドとしては、短く簡潔に目が届く範囲にコードを書くことが良いとされてます。曖昧なところがない限り、短いに越したことはないでしょう。不具合のないコードを書く秘訣は、コードを書かないことである、とも言われます。
Kotlin の Person クラスはたった1行でした。
class Person(var name: String)
class キーワードでクラスの定義が始まります。 続いて定義するクラス名として Person が続きます。
Kotlin ではここに引き続き、プライマリコンストラクタをひとつ記述できます。この1行だけを記述することで、 name という名前の String 型の読み書き可能なプロパティを作ることになります。 さらにコンストラクタに渡した値で、自動的に初期化されます。
クラスやプロパティは自動的に public アクセス可能になるので、それを利用する側では <変数名>.name として、 name プロパティが利用できるようになります。
とても簡単ですね。
このように Kotlin では、Kotlin 独特の書き方がありますが、Java (や C#) 的な比較的伝統的な感じのストレートフォワードな書き方も受け付けないわけでもありません。