AndroidDemoIn4Languages

May 23, 2017 · View on GitHub

使用 Java, Groovy, Scala 和 Kotlin 编写同一个应用来对比哪种语言更适合进行 Android 开发。

对比方法

每种语言只使用最小依赖

依赖情况报告

  • 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 Plugin 版本耗时 (秒)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 (包含在 Android SBT Plugin 中)

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
}

Callback

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 官方支持

结论

有待更多的对比...