首页 > 解决方案 > 在 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 无效并再次重新编译/构建?

标签: kotlin

解决方案


(我假设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以任何方式引用。


推荐阅读