Kotlin中的“内部”可见性修饰符工作吗?
假设Kotlin中的模块意味着一个项目(尽管很高兴看到Kotlin模块的确切定义意味着……不清楚从文档)…
Kotlin可见性修饰符是否还能工作? 我有两个项目,一个主项目和一个测试项目,具有不同的,不重叠的包路径。 测试项目依赖于主项目(在Eclipse中)。 主项目中的接口或类是否被标记为public
标记并不重要。 在测试项目中,主要的项目接口/类是可见/可访问的,不管它是什么。 唯一的区别是,如果您将主项目标记为private
,那么存在可见性问题。 但是无论是否public
这似乎都没有什么区别。
从我能从文档中得出的结果,在接口或类上省略可见性修饰符会影响默认的可见性,即internal
。
在当前的Kotlin中, internal
可见性修饰符确实被强制执行。
在Kotlin 1.0 Beta RC版本中,它表示:
可见性检查受到限制,例如,公开声明不能公开本地,私人或内部类型。 在编译器和IDE中检查对内部声明的访问;
而相关的发行说明有两点支持:
- 在编译器中检查内部可见性
- 内部函数和属性的名称被破坏(java互操作)
最后一点对于帮助阻止Java查看内部作用域标识符并与其交互至关重要。
在Kotlin M14发布公告中还提到:
- 内部是在编译器中检查(不仅IDE)
- 受保护的内部成员被禁止在接口中
再往后Kotlin M13的发布声明还显示:
- 现在可以在模块外面检查内部访问(详情如下)。
- 默认可见性(无修饰符)从内部变为公共,
- 我们最终启用了拒绝在模块外部使用内部声明的检查。
所以显然是功能和工作。
值得一提的是,它仅适用于Kotlin模块,但仍然可以访问来自Java模块的“内部”声明,尽管它显示了检查报告(警告)。