inline fun
时,会出现编译错误,错误信息如下:我发现几种方法可以在公共的Error:(22, 25) Kotlin: Public-API inline function cannot access non-public-API
private fun f(): Unit
defined incom.example
inline fun
中调用我的函数,但哪种方法是最好的呢?假设我有一个private fun f() { }
,那么我找到的选项如下:
fun f() { }
只需将其设置为公共函数。这是基本解决方案,但如果其他解决方案证明有重大缺点,则此方法可能成为最佳选择。
@PublishedApi internal fun f() { }
在Kotlin 1.1-M04中引入的注释可以应用于内部成员,使其有效地变为公共成员。我注意到的含义是,任何库用户仍然可以从Java代码中调用它,这是我不喜欢的。
@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") inline fun g() { f() }
在stdlib源代码中发现,该注释似乎可以抑制调用函数时出现的错误。但它有什么限制吗?它只能用于
inline
函数吗?在某些情况下,程序会失败吗?我尝试使用此技巧从内联函数调用非内联函数,并且它可以工作,但看起来很可疑。@JvmSynthetic @PublishedApi internal fun f() { }
将第二种解决方案与字节码中的synthetic标志相结合。我不确定这是否是
@JvmSynthetic
的正确用法, 但这似乎将函数从Java代码中隐藏起来,从而解决了@PublishedApi internal
的问题。
那么,这些解决方案中哪一个是从公共内联函数调用非公共函数的最佳方法?每种解决方案的缺点是我没有看到的吗?