当前位置:   article > 正文

Android:Kotlin与Java比较_android studio 工程中java文件和kotlin文件 区别

android studio 工程中java文件和kotlin文件 区别

一、Kotlin优势

1.1 优雅的解决Java空指针问题

1.1.1 编译期进行空指针检查

在这里插入图片描述
编译器静态分析并警告或编译Error:
在这里插入图片描述

1.1.2 精简防空判断代码

Java代码:

if(a != null && a.b != null && a.b.c != null) {
  String user = a.b.c.d;
}
  • 1
  • 2
  • 3

Kotlin代码:

val user = a?.b?.c?.d
  • 1

1.2 代码精简

1.2.1 精简Set/Get方法

Java代码:

public class User {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Kotlin代码:

class User {
  var name : String? = null
}
  • 1
  • 2
  • 3

属性访问对比:
Java代码:

user.setName("Java");
String name = user.getName();
  • 1
  • 2

Kotlin代码:

user.name = "Kotlin"
String name = user.name
  • 1
  • 2

1.2.2 精简属性调用

Java代码:

RequestBean requestBean = new RequestBean();
requestBean.method = AppService.METHOD_CASHIER;
requestBean.cartId = mCartId;
requestBean.merchantOrderInfo = "1234567890";
requestBean.merchantOrderId = "1234567890";
  • 1
  • 2
  • 3
  • 4
  • 5

Kotlin代码:

val requestBean = RequestBean().apply {
  method = AppService.METHOD_CASHIER
  cartId = mCartId
  merchantOrderInfo = "1234567890"
  merchantOrderId = "1234567890"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.2.3 精简单例模式

Java示例:

public class SingletonDemo {
  private static SingletonDemo instance = new SingletonDemo();
  private SingletonDemo() { }
  public static SingletonDemo getInstance() {
    return instance;
  }
public String getTAG() {
    return "Java";
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Kotlin示例:

object SingletonDemo {
  fun getTAG(): String {
    return "Kotlin"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5

二、从Java到Kotlin平滑过渡

2.1 Kotlin开发环境搭建

2.1.1 若为新项目,则IDE创建时选择Kotlin

2.1.2 若已有工程为全Java开发,可新建一个Kotlin类文件,IDE会自动配置Kotlin开发环境

2.1.3 Gradle中添加kotlin支持

project build.gradle添加支持:

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  • 1

module build.gradle添加支持:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  • 1

2.2 Kotlin与Java混编及互操作

2.2.1 Kotlin调用Java

Kotlin调用Java的get/set方法
Java示例:

public class User {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
public int getAge() {
    return 10;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Kotlin示例:

val user = User()
user.name = "Kotlin"
println(user.name)
println(user.age)
  • 1
  • 2
  • 3
  • 4

Kotlin调用Java的静态成员:
Java示例:

public class JDPayDeviceUtil {
  public static String getVersionName(Context context, String packageName) {
    PackageInfo info = getPackageInfo(context, packageName);
    if(info != null) {
      return info.versionName;
    }
    return "";
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Kotlin示例:

val versionName = JDPayDeviceUtil.getVersionName()
println("$versionName")
  • 1
  • 2

2.2.2 Java调用Kotlin

Kotlin示例:

class KotlinStatic {
  companion object {
    var number = 0
    fun staticMethod(string: String?) {
      println(string)
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Java示例:

KotlinStatic.Companion.staticMethod("Java");
  • 1

2.3 Kotlin与主流框架、SDK

可以平滑对接网络框架Retrofit、OkHttp、异步框架RxJava、CameraX等。很多主流框架和Google官方Demo也均使用纯Kotlin实现,如:OkHttp、CameraX。

val mediaType = MediaType.parse("text/x-markdown; charset=urg-8")
val requst = Request.Builder()
    .url("http://...")
    .post(RequestBody.create(mediaType, "kotlin-okhttp"))
    .build()

val client = OkHttpClient()

client.newCall(requst).enqueue(object : Callback {

  override fun onFailure(call: Call, e: IOException) {
    TODO("Not yet implemented")
  }

  override fun onResponse(call: Call, response: Response) {
    TODO("Not yet implemented")
  }

})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.4 Kotlin线程/异步操作

继承Thread类:

object : Thread() {
  override fun run() {
    println("running thread: ${currentThread()}")
  }
}.start()
  • 1
  • 2
  • 3
  • 4
  • 5

Kotlin封装类:

thread(start = true) {
  println("running thread: ${Thread.currentThread()}")
}
  • 1
  • 2
  • 3

同步线程锁:

@Synchronized fun syncMethod() {
  println("kotlin synchronized")
}

fun syncMethod() {
  println("kotlin none synchronized")
  synchronized(this) {
    println("kotlin synchronized")
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Kotlin协程/ Coroutines:
阻塞协程:

Log.d("Kotlin","thread id: ${mainLooper.thread.id}")
runBlocking {
  repeat(8) {
    Log.d("Kotlin","current thread: ${Thread.currentThread().id}")
    delay(1000)
  }
}
Log.d("Kotlin", "Blocking Coroutines END")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

异步协程:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val job = GlobalScope.launch {
        delay(2000)
        Log.d("Kotlin", "Coroutines thread id:${Thread.currentThread().id}")
    }
    Log.d("kotlin", "main thread END")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.5 Kotlin的IO操作

Java示例:

public static void writeText(String fileName, String txt) {
  try {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    outputStream.write(txt.getBytes());
    outputStream.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Kotlin示例:

File(fileName).writeText(txt)
File(fileName).appendText(txt)
File(fileName).writeBytes(arrayBytes)
File(fileName).appendBytes(arrayBytes)

val content = File(fileName).readText()
val bytes = File(fileName).readBytes()
val line = File(fileName).readLines()
val bitmap = BitmapFactory.decodeFile(fileName)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.6 Kotlin与数据库

Kotlin同样支持SQLite、Room数据库,与Java用法基本一致。

针对SQLite访问数据库,这里引用官方教程的一段话:
如果你使用了SQLiteOpenHelper,你可以调用getReadableDatabase()或者getWritableDatabase()(在生产环境的代码中产生的结果是一样的),但是之后你必须在接收到SQLiteDatabase的中调用close() 方法。你也必须在某个地方缓存助手类,同时,如果你从多个线程中使用了它,还得注意并发访问的问题。
有鉴于此,Kotlin结合Anko库推出了改良版的SQLite管理工具:ManagedSQLiteOpenHelper。

2.7 Kotlin与H5

Kotlin加载网页:

webView.loadUrl("https://www.jd.com/")
  • 1

物理返回键返回事件:

override fun onBackPressed() {
    if(webView.canGoBack()) {
        webView.goBack()
        return
    }
    super.onBackPressed()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Js与Kotlin互操作:

private fun initView() {
    val webSettings = webView.settings
    webSettings.javaScriptEnabled = true
    webView.addJavascriptInterface(JsToKotlin(), "Android")
    webView.loadUrl("https://www.jd.com/web/KotlinToJs.html")
}

private fun KotlinCallJs(string: String) {
    webView?.loadUrl("javascript:kotlinCallJs('$string')")
}

internal inner class JsToKotlin {
    @JavascriptInterface
    fun show() {
        println("kotlin被js调用了")
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.8 Kotlin与JNI

标识JNI方法关键字区别:
Java:native
Kotlin:external
Java示例:

public class SerialPort {

  static {
    System.loadLibrary("nativeJD");
  }

  public native String stringFromJNI();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Kotlin示例:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

	val string = stringFromJNI()
    }
    
    external fun stringFromJNI(): String

    companion object {
        init {
          System.loadLibrary("nativeJD")
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/580891
推荐阅读
相关标签
  

闽ICP备14008679号