kotlin - 在 Kotlin 中,更改内部类会破坏 ABI 吗?
问题描述
在 Kotlin 编程语言中,假设有一个模块结构,其类如下所示
/// module A
public interface Hello {
fun doSomething()
}
internal class HelloImpl {
override fun doSomething(){}
}
// end module A
// Module B--depends on---> Module A
import Hello
class HelloConsumer(private val hello: Hello) {
fun useDoSomething() {
hello.doSomething();
}
}
我的问题是对HellImpl
'sdoSomething
函数进行更改是否会破坏模块 A 的 ABI,从而使模块 B 无效并再次重新编译/构建?
解决方案
(我假设HelloImpl
实现Hello
)
不,它不会破坏 ABI,这样做是安全的。
我不确定要提供哪些资料来证明这一说法,但这是我们将代码拆分为公共接口和私有/内部实现的主要原因之一。模块 B 并不真正了解HelloImpl
,它没有引用它。在实践中,它使用HelloImpl
,但它不知道它。Hello
是它“看到”的唯一类型。
我们可以通过反编译来验证这一点HelloConsumer
。如果使用 IntelliJ 中提供的反编译器(我相信这是FernFlower
反编译器),我们会收到以下代码:
public final class HelloConsumer {
private final Hello hello;
public final void useDoSomething() {
this.hello.doSomething();
}
public HelloConsumer(@NotNull Hello hello) {
Intrinsics.checkNotNullParameter(hello, "hello");
super();
this.hello = hello;
}
}
正如我们所见,只HelloConsumer
使用Hello
类型,它不HelloImpl
以任何方式引用。
推荐阅读
- java - 仅在需要时更新 Java 中的字符串变量
- c# - 如何定义一个采用 List
和 List的方法 在 C# 中 - javascript - React Recompose:在 WithStateProps 中创建的方法不可访问
- eclipse - BIRT 报告/将两个数据集中的字段合并到一个动态文本框中
- javascript - 使用 Angular7/firebase 对数组中的数据进行排序
- google-vision - Google Vision Api 文本检测换行符
- android - 执行 Espresso 测试时更改语言环境
- sql-server - MS Access DNSless 连接到 MS SQL Server 用户 ID/通过失败
- r - ggplot 地图上的意外形状
- javascript - React 组件未连接到商店