导读大纲
-
-
- [1.1.1 Kotlin 是安全的](#1.1.1 Kotlin 是安全的)
- [1.1.2 Kotlin 具有互操作性](#1.1.2 Kotlin 具有互操作性)
- [1.1.3 什么是 idiomatic Kotlin?](#1.1.3 什么是 idiomatic Kotlin?)
-
1.1.1 Kotlin 是安全的
-
一般来说 ,当我们说一种编程语言是安全的
- 我们指的是它的设计 可以防止程序中出现某些类型的错误
- 当然,这并不是绝对的;没有一种语言 能防止所有可能出现的错误
-
此外,防止错误通常是有代价的
- 你需要向编译器提供更多关于程序预期运行的信息
- 这样编译器才能验证这些信息是否与程序的运行相符
- 因此,您需要在所获得的安全级别
- 和为添加更详细注释而损失的生产率 之间做出权衡
- 你需要向编译器提供更多关于程序预期运行的信息
-
在 JVM 上运行 已经提供许多安全保障
- 例如,内存安全、防止缓冲区溢出
- 以及其他因不正确使用动态分配的内存而导致的问题
- 作为 JVM 上的静态类型语言 ,Kotlin 还能确保应用程序的类型安全
- 此外,Kotlin 还能更进一步:它能轻松定义只读变量 (通过 val 关键字 )
- 并快速将它们归类到不可变(data)类中
- 从而为多线程应用程序提供额外的安全性
- 例如,内存安全、防止缓冲区溢出
-
除此之外,Kotlin还会在编译时进行检查 ,以防止运行时出现错误
- 最重要的是 ,Kotlin 致力于消除程序中的 NullPointerException
- Kotlin 的类型系统 会可以跟踪为空和不能为空的值
- 并禁止在运行时导致 NullPointerException 异常的操作
- 为此所需的额外成本极低
- 将一个类型标记为可空 只需一个字符,即结尾的问号
- 作为补充,Kotlin 提供许多方便的方法来处理空数据
- 这大大有助于避免应用程序崩溃
kotlin
fun main() {
var s: String? = null // 可以为空
var s2: String = "" // 不能为空
println(s.length) // 不会编译, 免于崩溃
println(s2.length) // 将按预期运行
}
- Kotlin 还能帮助避免另一种异常 ,那就是**"类转换异常"**
- 当你在未检查对象类型是否正确 的情况下
- 就将其转换到某个类型 时就会发生这种异常
- Kotlin 将检查和转换合并为单个操作 (智能转换)
- 这意味着一旦你检查类型 ,就可以引用该类型的成员
- 而无需任何额外的转换、重新声明或检查
- 这意味着一旦你检查类型 ,就可以引用该类型的成员
- <1> 在本例中,编译器对值变量进行类型检查 ,该变量可能是 Any 类型
- 编译器知道,在条件的真分支 中,value 必定是 String 类型
- 因此它可以安全地允许使用该类型的方法(即所谓的smart-cast)
- 当然你可以手动执行转换(value as String)
- 可以但是没必要,并不符合idiomatic Kotlin
- 编译器知道,在条件的真分支 中,value 必定是 String 类型
- 当你在未检查对象类型是否正确 的情况下
kotlin
fun modify(value: Any) { // <1>
if (value is String) { // <1>
// val value = value as String
println(value.uppercase()) // <1>
}
}
1.1.2 Kotlin 具有互操作性
-
关于互操作性,首先关心的 可能是:"我能使用现有的库吗?
- 对于Kotlin, 答案是 "是的,绝对可以"
- 无论库需要哪种 API,您都可以在 Kotlin 中使用它们
- 您可以调用 Java 方法、扩展 Java 类和实现接口
- 将 Java 注解应用到 Kotlin 类等等
-
与其他一些 JVM 语言不同, Kotlin 在互操作性方面更进一步
- 使得从 Java 调用 Kotlin 代码也毫不费力,无需任何技巧
- Kotlin 类和方法 可以像普通 Java 类和方法一样被调用
- 这样,您就可以在项目的任何地方灵活地混合使用Java和Kotlin代码
- 当您开始在 Java 项目中采用 Kotlin 时
- 您可以在代码库中的任何一个类 上运行Java到 Kotlin 的转换器
- 而代码的其余部分将继续编译和运行 , 无需做任何修改
-
Kotlin 注重互操作性的另一个方面 是尽可能多地使用现有的 Java 库
- 例如,Kotlin 的集合几乎完全依赖于 Java 标准库类
- 并为它们扩展额外的功能 ,以便在 Kotlin 中更方便地使用
- 这意味着当你从 Kotlin 调用 Java API 时
- 永远不需要包装或转换对象,反之亦然
- Kotlin 提供的所有丰富 API 在运行时无需任何成本
- 例如,Kotlin 的集合几乎完全依赖于 Java 标准库类
-
Kotlin 工具还为跨语言项目提供全面支持
- 它可以编译任意混合的 Java 和 Kotlin 源文件
- 无论它们如何相互依赖
- IDEA和Android Studio中的IDE功能也能跨语言工作 ,允许执行以下操作
- 在 Java 和 Kotlin 源文件之间自由导航
- 调试混合语言项目 ,并在不同语言编写的代码之间进行切换
- 重构Java方法 ,并正确更新它们在Kotlin代码中的使用,反之亦然
- 它可以编译任意混合的 Java 和 Kotlin 源文件
1.1.3 什么是 idiomatic Kotlin?
-
在讨论 Kotlin 代码时,有一个短语经常出现: idiomatic Kotlin
-
简单地说,idiomatic Kotlin就是母语为 Kotlin 的用户如何编写代码
- 并在适当的地方使用语言特性和语法糖
- 这样的代码由惯用语组成 ---可识别的结构(模式)
- 以"Kotlin 方式"解决 您试图解决的问题
-
惯用化代码符合社区普遍接受的编程风格 ,并遵循语言设计者的建议
- 与其他技能一样,学习编写惯用的 Kotlin 代码需要时间和实践
- 在阅读代码示例并编写自己的代码的过程中
- 将逐渐对惯用的 Kotlin 代码 的外观和感觉形成直觉
- 并获得在自己的代码中独立应用这些知识的能力