Android:Kotlin与Java比较
一、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; }
Kotlin代码:
val user = a?.b?.c?.d
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; } }
Kotlin代码:
class User {
var name : String? = null }
user.setName("Java"); String name = user.getName();
Kotlin代码:
user.name = "Kotlin" String name = user.name
1.2.2 精简属性调用
Java代码:
RequestBean requestBean = new RequestBean(); requestBean.method = AppService.METHOD_CASHIER; requestBean.cartId = mCartId; requestBean.merchantOrderInfo = ""; requestBean.merchantOrderId = "";
Kotlin代码:
val requestBean = RequestBean().apply {
method = AppService.METHOD_CASHIER cartId = mCartId merchantOrderInfo = "" merchantOrderId = "" }
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"; } }
Kotlin示例:
object SingletonDemo {
fun getTAG(): String {
return "Kotlin" } }
二、从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"
module build.gradle添加支持:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
2.2 Kotlin与Java混编及互操作
2.2.1 Kotlin调用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; } }
Kotlin示例:
val user = User() user.name = "Kotlin" println(user.name) println(user.age)
public class JDPayDeviceUtil {
public static String getVersionName(Context context, String packageName) {
PackageInfo info = getPackageInfo(context, packageName); if(info != null) {
return info.versionName; } return ""; } }
Kotlin示例:
val versionName = JDPayDeviceUtil.getVersionName() println("$versionName")
2.2.2 Java调用Kotlin
Kotlin示例:
class KotlinStatic {
companion object {
var number = 0 fun staticMethod(string: String?) {
println(string) } } }
Java示例:
KotlinStatic.Companion.staticMethod("Java");
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") } })
2.4 Kotlin线程/异步操作
继承Thread类:
object : Thread() {
override fun run() {
println("running thread: ${
currentThread()}") } }.start()
Kotlin封装类:
thread(start = true) {
println("running thread: ${
Thread.currentThread()}") }
同步线程锁:
@Synchronized fun syncMethod() {
println("kotlin synchronized") } fun syncMethod() {
println("kotlin none synchronized") synchronized(this) {
println("kotlin synchronized") } }
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")
异步协程:
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") }
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(); } }
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)
2.6 Kotlin与数据库
Kotlin同样支持SQLite、Room数据库,与Java用法基本一致。
2.7 Kotlin与H5
Kotlin加载网页:
webView.loadUrl("https://www.jd.com/")
物理返回键返回事件:
override fun onBackPressed() {
if(webView.canGoBack()) {
webView.goBack() return } super.onBackPressed() }
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调用了") } }
2.8 Kotlin与JNI
public class SerialPort {
static {
System.loadLibrary("nativeJD"); } public native String stringFromJNI(); }
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") } } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213288.html原文链接:https://javaforall.net
