专栏名称: Android_开发者
目录
相关文章推荐
51好读  ›  专栏  ›  Android_开发者

使用 Kotlin 构建 Android 应用 | Kotlin 迁移指南 (上篇)

Android_开发者  · 掘金  · android  · 2019-10-31 02:09

正文

阅读 130

使用 Kotlin 构建 Android 应用 | Kotlin 迁移指南 (上篇)

今年五月份的 Google I/O 上,我们正式向全球宣布 Kotlin-first 的这一重要理念,Kotlin 将成为 Android 开发者的首选语言。接下来的几周我们将会为大家连载关于 Kotlin 迁移指南的系列文章,包含 Kotlin 的优势和介绍 (上篇)、迁移到 Kotlin (中篇),以及使用 Kotlin 的常见问题 (下篇),帮助开发者们顺利迁移并开始使用 Kotlin 构建 Android 应用。

了解 Kotlin ,以及使用它的优势

Kotlin 是一种现代的静态设置类型编程语言,可以提高开发者的工作效率,并提升开发者的工作愉悦度。

优势 1: 可与 Java 互操作

与 Android SDK 和 Java 程序语言库兼容,Kotlin 代码中可以方便调用 Java 库 (Android Studio 的 Lint 检查亦能与 Kotlin 代码互操作)。

优势 2: 与 IDE 工具兼容

Kotlin 语言由 IntelliJ 的开发团队设计,可与 IntelliJ (以及 Android Studio) 完美搭配使用,Android Studio 为 Kotlin 提供了一流的支持,比如,您可通过内置工具来将 Java 代码转换成 Kotlin 代码。或者借助 “Show Kotlin Bytecode” 工具,您可以在学习 Kotlin 时查看等效的 Java 代码。

优势 3: 空安全检测

默认情况下,Kotlin 可避免空指针异常发生。而且可以在开发时而不是运行时发现和避免错误。

fun foo(p: int) { ... }
foo(null) // 编译器报错

var o: String? = ...
println(o.toLowerCase()) // 编译器报错
复制代码

△ 上面两个例子都会触发编译器报错, 从而避免了在运行时出现崩溃

优势 4: 更简洁的代码

Kotlin 有着更简洁明了的语法,可减少样板代码的使用。

// Java 语言类代码
public class User {

    private String firstName;
    private String lastName;
    
    public User(String firstName, String lastName) {...}
    public String getFirstName() {...}
    public void setFirstName(String firstName) {...}
    public String getLastName() {...}
    public void setLastName(String lastName) {...}
}
复制代码

比如上例中的数据类代码,有字段以及对应的 getter 和 setter 方法,虽然都是常规内容,但不免繁琐,而且大量的样本代码也会占用开发者的精力。我们来看看同样的类用 Kotlin 如何编写:

// Kotlin 语言,同样的类代码
class User(
    var firstName: String?,
    var lastName: String?
)
复制代码

Kotlin 还支持扩展方法 ,可以给现有的类附加新的方法 (而不需要修改类的原始代码)。比如我们想计算字符串内某个字符出现的次数,通常我们这么做:

// 定义方法
fun howMany(string: String, char: Char): Int {
    var count = 0
    val lowerCaseLetter = char.toLowerCase()
    for (i in 0 until string.length) {
        if (lowerCaseLetter == string[i].toLowerCase()) count++
    }
    return count
}

// 计算“Elephant”里有几个“e”
val string = "Elephant"
howMany(string, 'e')
复制代码

有了扩展方法,我们可以直接把 howMany 这个方法添加至 String 类:

// 扩展方法
fun String.howMany(char: Char): Int {
    var count = 0
    val lowerCaseLetter = char.toLowerCase()
    for (i in 0 until length) {
        if (lowerCaseLetter == this[i].toLowerCase()) count++
    }
    return count
}

// 执行
val string = "Elephant"
string.howMany('e')
复制代码

如此一来,我们就直接 “问” string “你里面有几个‘e’字符” 就可以了,这更简洁、自然,可读性也大幅提升。

Kotlin 还支持指定/默认参数 ,这让开发者在编写方法时,不需要为不同参数的版本另写一个方法,而是直接在同一个方法里,通过 “?” 标出可空参数,通过 “=” 给出参数的默认值即可。

// View.java
public View(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
}

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    // ...
}

// 和上述内容等效的 Kotlin 代码
class View(context: Context, attrs: AttributeSet?, defStyleAttr: Int = 0, defStyleRes: Int = 0) {
    // ...
}
复制代码

△ 使用 Kotlin 仅需要定义一个构造函数即可

优势 5: 语言特性带来的进阶功能

Kotlin 也在持续为开发者带来更多高级的语言特性,协程就是一个突出的例子。

Kotlin 里的协程可以理解为从语言级别实现了异步或非阻塞编程,并在 Kotlin 1.3 中开始提供,在 Android 上使用协程可以避免下面的问题:

  • 通过主 (界面) 线程进行调用时可以确保安全 (比如在主线程中异步访问数据库)
  • 避免在主线程上运行耗时较长的任务 (如图像或网络操作) 时发生阻塞

比如下面这个例子,使用协程时不会对主线程造成阻塞,并可提高可读性:







请到「今天看啥」查看全文