Kotlin1.8新特性

  • Post author:
  • Post category:其他




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

不同版本的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



版权声明:本文为u011897062原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。