Dive into Coding Life

KotlinLearning: 03-5 関数

トップレベルの関数とプロパティ

トップレベル関数

Kotlinではクラスに含まれないトップレベルに関数を定義することができます。
これはJavaではファイル名Kt.classの静的なpublicメソッドとして生成されます。

package strings
fun joinToString(...): String{...}

このKotlinコードをjoin.ktというファイル名で保存し、Javaにトランスパイルされた場合、Javaコードは以下のように生成されます。

package strings;
public class JoinKt {
  public static String joinToString(...) {...}
}

ファイル名を指定したい場合はパッケージよりも上のファイルの冒頭に@JvmName()アノテーションを置きます。

@file:JvmName("StringFunctions")
package strings
fun joinToString(...): String{...}

トップレベルプロパティ

プロパティをトップレベルに置くことはあまりありませんが、定数等で利用する場合があります。

var count = 0 //privateな静的変数
val MAX_COUNT = 10 //privateな静的定数

これらはprivateなアクセス修飾子になりますので、Javaからはgetterやsetterを使ってアクセスする必要があります。
より自然な定数を宣言したい場合はconstを使います。

const val MAX_COUNT = 10
public static final String MAX_COUNT = 10;

constはfinalと説明されますが、ここでの挙動を見ると以下のように動作しています。

  • Kotlinでトップレベルに置くとJavaではprivate staticを意味する
  • Kotlinでconstを指定するとJavaではpublicを意味する(ただしconstはvalにのみ指定可能)

こうしてみると単純なpublicで静的な所謂グローバル変数はKotlinからは宣言できないことがわかります。

Kotlinではこれに似た機能としてあるクラス内に定義するコンパニオンオブジェクトを利用します。
コンパニオンオブジェクト自体は内部クラスに変換され、privateなコンストラクタを持つシングルトンオブジェクトになります。
コンパニオンオブジェクト内のvar変数は静的なprivate変数に、val変数は静的でfinalなprivate変数に変換されます。
元にクラスにはpublicで静的でfinalな内部クラスCompanionが生成されますので、そのpublicなgetter、setterを用い変数にアクセスします。
シングルトンのCompanionを介してアクセスするところがトップレベルプロパティとは異なります。