Kotlin 中内部可见性修饰符的范围

Posted

技术标签:

【中文标题】Kotlin 中内部可见性修饰符的范围【英文标题】:Scope of internal visibility modifier in Kotlin 【发布时间】:2014-11-06 22:19:15 【问题描述】:

我在理解内部访问修饰符时遇到了问题。在我的示例中,我无法产生任何行为与公开不同的情况。即使我创建了一个 jar,我也可以从 jar 外部访问 jar 中的内部函数(来自与 jar 中使用的包无关的不同包)。在文档中使用了术语模块,但我无法找出模块的确切含义。

因此我的问题是:

    kotlin 中的模块是什么?

    访问修饰符 internal 与 public 修饰符有何不同?

【问题讨论】:

【参考方案1】:

Kotlin 编译器版本 M8 (0.8.11) 会忽略模块,更准确地说,它就像您的所有代码都放入同一个模块一样工作,这就是为什么您无法收到 internal 的可见性错误。

从下一个里程碑版本开始,您创建的每个 IDE 模块都有自己的可见性范围,当您尝试从另一个模块中的一个模块访问 internal 声明时,您会收到错误消息。另一方面,公众在整个项目中都是可见的。

更新:这个在 M8 中没有开启,推迟到以后

更新:从later Kotlin milestones and betas开始,此功能已开启

【讨论】:

你说的“IDE模块”是什么意思? 用 IntelliJ IDEA 的话来说:当你在 IDE 中打开一个项目时,它有许多模块,每个模块都有许多源根和依赖项/类路径。 现在清楚了,对我来说这与 Java 的“包私有”概念有点混淆。 仅供参考,找不到internal 可见性修饰符的太多用途。每个“清洁架构”方法的典型项目结构是高度模块化的,这意味着,例如,域实体和服务位于独立模块中,并且它们的属性和功能(private 除外)必须声明为public 才能跨模块的边界。对我来说,这是对源代码中public 关键字的入侵。有什么建议可以让它不那么冗长吗? 是的,我们计划在下一个里程碑中最终启用它们

以上是关于Kotlin 中内部可见性修饰符的范围的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin学习笔记之可见性修饰符

从 internal 修饰符一探 kotlin 的可见性控制

从 internal 修饰符一探 kotlin 的可见性控制

对比Java学Kotlin可见性修饰符

对比Java学Kotlin可见性修饰符

对比Java学Kotlin可见性修饰符