この記事はアクトインディ Advent Calendar 2016 15日目になります。
どうぞよろしくお願いします。
アクトインディではAndroidアプリの開発言語にKotlinを採用しています。
Kotlinではstaticというキーワードはありません。
staticなメソッドを実装するためにはcompanion objectを使って実装します。
また、companion objectはクラス内にシングルトンオブジェクトを生成する場合にも使用されます。
今回はKotlinで実装されたcompanion objectがJavaではどうような定義になるのか?どのように動作しているのかを理解するためにKotlinコードからJavaコードに変換してみたいと思います。
検証環境
Kotlin Compiler version 1.0.5-2
java version “1.8.0_92”
Jad v1.5.8g.
KotlinコードからJavaコードに変換するには?
①Kotlinコード(sample.kt)をCompileします。
$ kotlinc sample.kt -include-runtime -d sample.jar
②Compileして出来たsample.jarからclassファイルを取り出します。
$ jar -xvf sample.jar
③classファイルからJavaコードに逆コンパイルします。
これでKotlinコードからJavaコードに変換できます。
$ jad -s java -d src -r sample.class
Kotlinサンプルコード
以下のKotlinサンプルコードをJavaコードに変換します。
class Sample {
companion object {
var sampleProperty: String = ""
fun sampleMethod1() {
this.sampleProperty = "sample method1"
}
fun sampleMethod2() {
this.sampleProperty = "sample method2"
}
}
}
変換後のJavaコード
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
public final class Sample
{
public static final class Companion
{
public final String getSampleProperty()
{
return Sample.sampleProperty;
}
public final void setSampleProperty(String <set-?>)
{
Intrinsics.checkParameterIsNotNull(<set-?>, "<set-?>");
Sample.sampleProperty = <set-?>;
}
public final void sampleMethod1()
{
setSampleProperty("sample method1");
}
public final void sampleMethod2()
{
setSampleProperty("sample method2");
}
private Companion()
{
}
public Companion(DefaultConstructorMarker $constructor_marker)
{
this();
}
}
public Sample()
{
}
private static String sampleProperty = "";
public static final Companion Companion = new Companion(null);
}
Sampleクラス内にはstaticなインナークラスであるCompanionが定義されています。
また、Sampleクラスのprivateなクラス変数としてsamplePropertyとpublicなクラス変数としてCompanionが定義されています。
これで外部からメソッドへのアクセスはSample.Companion. sampleMethod1()という表現になり、samplePropertyへのアクセスはCompanion経由で行い、制御していることがわかります。
まとめ
Kotlin→Javaへの変換はそんなに難しいことではありません。
companion objectはJavaではstaticを駆使して実現されていました。
同じことを処理をするKotlinコードとJavaコードを見比べるとやはりJavaの方がコード量が多くなりがちでKotlinが如何に簡潔に書けるか実感することが出来ました。