Kotlin1.8.0新特性
新特性概述
- JVM 的新实验性功能:递归复制或删除目录内容
- 提升了 kotlin-reflect 性能
- 新的 -Xdebug 编译器选项,提供更出色的调试体验
- kotlin-stdlib-jdk7 与 kotlin-stdlib-jdk8 合并为 kotlin-stdlib
- 提升了 Objective-C/Swift 互操作性
- 与 Gradle 7.3 兼容
递归复制或删除目录内容
注意:
这些新功能对于`java.nio.file.path`来说是实验性的。如果要调用他们,你需要添加`@OptIn(kotlin.io.path.ExperimentalPathApi::class)`或者`@kotlin.io.path.ExperimentalPathApi`注释。你也可以添加编译器选项`-opt-in=kotlin.io.path.ExperimentalPathApi`。
两个扩展函数,它允许你递归:
java.nio.file.PathcopyToRecursively()
deleteRecursively()
- 将目录及其内容复制到另一个目标。
-
删除目录及其内容。
作为备份过程的一部分,这些功能非常有用。
异常处理
copyToRecursively() onError
例如:
sourceRoot.copyToRecursively(destinationRoot, followLinks = false,
onError = { source, target, exception ->
logger.logError(exception, "Failed to copy $source to $target")
OnErrorResult.TERMINATE
})
使用 时,如果在删除文件或文件夹时发生异常,则会跳过该文件或文件夹。删除完成后,将引发包含作为抑制异常发生的所有异常。
deleteRecursively() deleteRecursively() IOException
文件覆盖
如果发现目标目录中已存在文件,则会发生异常。如果要覆盖该文件,请使用
with
作为参数的重载并将其设置为 :
copyToRecursively() overwrite true
例如:
fun setUpEnvironment(projectDirectory: Path, fixtureName: String) {
fixturesRoot.resolve(COMMON_FIXTURE_NAME)
.copyToRecursively(projectDirectory, followLinks = false)
fixturesRoot.resolve(fixtureName)
.copyToRecursively(projectDirectory, followLinks = false,
overwrite = true) // patches the common fixture
}
自定义复制操作
重载
copyAction
, 例如:
sourceRoot.copyToRecursively(destinationRoot, followLinks = false) { source, target ->
if (source.name.startsWith(".")) {
CopyActionResult.SKIP_SUBTREE
} else {
source.copyToIgnoringExistingDirectory(target, followLinks = false)
CopyActionResult.CONTINUE
}
}
提升了 kotlin-reflect 性能
利用现在使用 JVM 目标 1.8 编译的事实,我们将内部缓存机制迁移到 Java 的 .以前我们只缓存 ,但现在我们也缓存和.这些更改在调用 时显著提高了性能。
kotlin-reflect ClassValue KClass KType KDeclarationContainer typeOf()
新的 -Xdebug 编译器选项
Kotlin 1.8.0 添加了一个新的编译器选项,该选项禁用优化以获得更好的调试体验。目前,该选项禁用协程的“已优化”功能。将来,在我们添加更多优化后,此选项也会禁用它们。
-Xdebug
“已优化”功能可在使用挂起函数时优化变量。但是,很难使用优化变量调试代码,因为看不到它们的值。
禁止在生产环境中使用该选项,可能会产生内存泄露。
kotlin-stdlib-jdk7
与
kotlin-stdlib-jdk8
合并为
kotlin-stdlib
kotlin-stdlib-jdk7
kotlin-stdlib-jdk8
kotlin-stdlib
不同版本的stdlib已统一合并到
kotlin-stdlib
中
提升了Object及Swift的互操作
为了使 Kotlin 与 Objective-C 和 Swift 更具互操作性,添加了三个新的注释:
-
@ObjCName
允许您在 Swift 或 Objective-C 中指定一个更惯用的名称,而不是重命名 Kotlin 声明。
该注释指示 Kotlin 编译器为此类、属性、参数或函数使用自定义的 Objective-C 和 Swift 名称:
@ObjCName(swiftName = "MySwiftArray")
class MyKotlinArray {
@ObjCName("index")
fun indexOf(@ObjCName("of") element: String): Int = TODO()
}
// Usage with the ObjCName annotations
let array = MySwiftArray()
let index = array.index(of: "element")
-
@HiddenFromObjC
允许您从 Objective-C 中隐藏 Kotlin 声明。
注释指示 Kotlin 编译器不要将函数或属性导出到 Objective-C 并因此导出到 Swift。这可以使您的 Kotlin 代码对 Objective-C/Swift 更加友好。
-
@ShouldRefineInSwift
对于用 Swift 编写的包装器替换 Kotlin 声明很有用。
注释指示 Kotlin 编译器将函数或属性标记为生成的 Objective-C API 中的函数或属性。这样的声明获得前缀,这使得它们对 Swift 代码不可见。
swift_private__
与 Gradle 7.3 兼容
Kotlin 1.8.0 完全支持 Gradle 版本 7.2 和 7.3。您也可以使用 Gradle 版本至最新的 Gradle 版本,但如果您这样做,请注意,您可能会遇到弃用警告,或者某些新的 Gradle 功能可能无法使用。
此版本带来了许多更改:
-
将 Kotlin 编译器选项公开为 Gradle 惰性属性
-
提高支持的最低版本
从 Kotlin 1.8.0 开始,支持的最低 Gradle 版本为 6.8.3,支持的最低 Android Gradle 插件版本为 4.1.3。
gradle插件版本与gradle版本的对应关系如下
https://kotlinlang.org/docs/gradle-configure-project.html#apply-the-plugin -
能够禁用 Kotlin 守护进程回退策略
kotlin.daemon.useFallbackStrategy true false useDaemonFallbackStrategy
编译通常运行在gradle守护进程上,如果守护进程因为某些原因挂掉了,那么还可以在守护进程之外编译运行。
-
在传递依赖项中使用最新的
kotlin-stdlib
版本
通过以下选项对齐kotlin版本
kotlin.stdlib.jdk.variants.version.alignment=false
//或者
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
-
强制检查相关 Kotlin 和 Java 编译任务的 JVM 目标兼容性相等性
-
解决 Kotlin Gradle 插件的传递依赖关系
为避免传递依赖中版本不一致导致编译出错,添加下列选项来进行约束
dependencies {
constraints {
implementation("org.jetbrains.kotlin:kotlin-sam-with-receiver:1.8.0")
}
}
-
弃用和移除
具体查看如下链接:
https://kotlinlang.org/docs/whatsnew18.html#deprecations-and-removals
参考
https://kotlinlang.org/docs/whatsnew18.html
https://kotlinlang.org/docs/whatsnew-eap.html