AndroidDemoIn4Languages

May 23, 2017 · View on GitHub

どの言語はアンドロイド開発に似合うを探すのために、JavaやGroovyやScala やKotlinを使用して同じアプリを作る。

比較方法

依存を最小限に利用する。

依存情報報告

  • Java
    • インポート com.android.support:appcompat-v7:25.2.0
  • Groovy
    • インポート com.android.support:appcompat-v7:25.2.0
    • インポート org.codehaus.groovy:groovy:2.4.10:grooid
    • インポート org.codehaus.groovy:groovy-json:2.4.10
  • Scala
    • インポート com.android.support:appcompat-v7:25.2.0
    • インポート org.scala-lang:scala-library:2.11.8
  • Kotlin
    • インポート com.android.support:appcompat-v7:25.2.0
    • インポート org.jetbrains.kotlin:kotlin-stdlib:1.1.1

分析報告

行数統計

言語ファイル数空行数注釈行数ソースコード行数
Java3209157
Groovy3239140
Scala3329127
Kotlin3239136

サイズ統計

言語Proguard を利用しない(バイト)Proguard を使用して(バイト)
Java1,438,673893,137
Groovy3,395,9361,982,125
Scala3,277,0071,349,352
Kotlin1,833,258903,566

メソッド数

言語Proguard を利用しないProguard を使用して
Java17,4167,608
Groovy47,98224,379
Scala67,60820,109
Kotlin23,5877,656

コンパイルスピード

MacBook Pro (Retina, 15-inch, Mid 2014 & APPLE SSD SM0256F Media)でテストする

Gradle タスク: ./gradlew :app:clean :app:assembleDebug SBT タスク: sbt app/clean app/android:package

言語Gradle プラグイン バージョン時間かかる(秒)SBT時間かかる(秒)
Java2.2.0≈ 80.13.12≈ 10
Groovy2.2.0≈ 200.13.12-
Scala1.3.1≈ 280.13.12≈ 17
Kotlin2.2.0≈ 90.13.12≈ 20

ソースコード対比

Find View

Java

TextView title = (TextView)view.findViewById(android.R.id.text1);

Groovy

def title = view.findViewById(android.R.id.text1) as TextView

Scala

Typed Resources を利用して (ほか依存は追加しない):

val title = view.findView(TR.text1)

メモ:普通的な文法も使える

val title = view.findViewById(android.R.id.text1).asInstanceOf[TextView]

Kotlin

Kotlin Android Extensions を利用して (ほか依存は追加しない):

val title = view.text1

メモ:普通的な文法も使える

val title = view.findViewById(android.R.id.text1) as TextView

OnClickListener

Java

button.setOnClickListener(new View.OnClickListener() {
    @Override
    void onClick(final View v) {
      //  do something
    }
})

Groovy

button.onClickListener = {
    //  do something
}

Scala

button.onClick((v: View) =>
    //  do something
)

Kotlin

button.setOnClickListener {
    //  do something
}

コールバック

Java

public interface FindCallback {
    void onFinish(List<String> results, Exception e);
}
private void findCountries(FindCallback doneCallback) {
    try {
        //  a long time mission
        doneCallback.onFinish(results, null);
    } catch (Exception e) {
        doneCallback.onFinish(null, e);
    }
}
findCountries(new FindCallback(){
    void onFinish(List<String> results, Exception e){
      //  handle result
    }
});

Groovy

def findCountries(Closure doneCallback) {
    try {
        //  a long time mission
        doneCallback(results, null)
    } catch (e) {
        doneCallback(null, e)
    }
}
findCountries{ List<String> results, Exception e ->
  //  handle result
});

Scala

def findCountries(doneCallback: (ArrayBuffer[String], Exception) => Unit):Unit = {
    try {
        //  a long time mission
        doneCallback(results, null)
    } catch {
        case e: Exception => doneCallback(null, e)
    }
}
findCountries((names: ArrayBuffer[String], e: Exception) =>
  //  handle result
)

Kotlin

fun findCountries(doneCallback: (List<String>?, Exception?) -> Unit) {
    try {
        //  a long time mission
        doneCallback(results, null)
    } catch (e: Exception) {
        doneCallback(null, e)
    }
}
findCountries{ list, e ->
  //  handle result
}

コミュニティサポート

  • Java 原生サポート
  • Groovy 公式サポート
  • Scala なし
  • Kotlin 公式サポート

結論

続く。。。