gpt4 book ai didi

内联函数无法访问非公共(public) API : @PublishedApi vs @Suppress vs @JvmSynthetic

转载 作者:IT老高 更新时间:2023-10-28 13:30:42 27 4
gpt4 key购买 nike

在 Kotlin 中,当我有一个非公共(public)成员和一个调用它的 inline fun 时,会出现编译错误:

Error:(22, 25) Kotlin: Public-API inline function cannot access non-public-API private fun f(): Unit defined in com.example

我找到了几种在公共(public) inline fun 中调用我的函数的方法,但哪种方法最好?

假设我有一个 private fun f() { }。那么我找到的选项是:

  • fun f() { }

    只要公开。这是基准解决方案,但如果其他解决方案有很大的缺点,这可能是最好的解决方案。

  • @PublishedApi 内部函数 f() { }

    Kotlin 1.1-M04 中引入,注释可以应用于内部成员,使其有效地公开。我注意到的含义是任何库用户仍然可以从 Java 代码中调用它,这就是我不喜欢它的地方。

  • @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") 内联函数 g() { f() }

    发现于 the stdlib sources ,此注释在应用于调用函数时似乎抑制了错误。但它的局限性是什么?它只能用于 inline 函数吗?生成的程序在某些情况下会失败吗?我试图用这个技巧从一个内联函数调用一个非内联函数,它奏效了,但看起来很可疑。

  • @JvmSynthetic @PublishedApi 内部乐趣 f() { }

    将第二个解决方案与字节码中的 synthetic 标志结合起来。我不确定这是否是 correct usage of @JvmSynthetic ,但这似乎对 Java 代码隐藏了该函数,从而解决了 @PublishedApi 内部的问题。

那么,这些解决方案中的哪一个是从公共(public)内联函数调用非公共(public)函数的最佳方式?我看不到的每种解决方案的缺点是什么?

最佳答案

@PublishedApi internal 是公开非公共(public) API 以在公共(public)内联函数中使用的预期方式。

那个 @PublishedApi internal 成员实际上变成了公开的,并且它的名称​​不会被破坏(如果您注意到相反的情况,请提交错误)。

@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") 是一种基于抑制错误而缺少 @PublishedApi 的创可贴解决方法,因此不推荐使用。随着 @PublishedApi 的引入,这种抑制将从标准库中清除。

@JvmSynthetic 结合 @PublishedApi 是一种有趣的方法,但它在调试时可能会导致一些问题,尽管我不确定。

关于内联函数无法访问非公共(public) API : @PublishedApi vs @Suppress vs @JvmSynthetic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41892715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com