【问题标题】:Package equivalent visibility modifier in KotlinKotlin 中的包等效可见性修饰符
【发布时间】:2016-02-22 09:48:35
【问题描述】:

我正在编写一个使用工厂模式的程序。我有一个名为 AssetFundCalculator 的接口和一个名为 AssetFundCalculatorImpl 的类,它实现了该接口。

AssetFundValidator 类验证一些输入,并能够实例化一个有效的 AssetFundCalculatorImpl

我希望程序的其余部分只知道接口,而不知道 AssetFundCalculatorImpl,这样只有 AssetFundValidator 可以实例化它。

我的包结构是这样的:

在 Java 中,我会给 AssetFundCalculatorImpl 类或它的构造函数提供包可见性修饰符,这样可以解决问题,但在 Kotlin 中,没有包可见性修饰符。

有解决办法吗? 我不想把这段代码放到单独编译的模块中,所以 internal 修饰符不起作用。

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

    你可以把AssetFundValidatorAssetFundCalculatorImpl放到同一个文件里,把AssetFundCalculatorImpl标记为private。在这种情况下,它只能被同一文件中的代码访问,包括AssertFundValidator,但不能被程序其他部分的任何代码访问。

    【讨论】:

    • 毕竟我没有使用这个解决方案,我真的不喜欢将两个类放在一个文件中。从语言中省略包修饰符的原因是什么?
    • 你应该习惯将多个类放在一个文件中,这是 Kotlin 中非常常见的模式。我们没有包含包本地可见性,因为它不是隐藏任何东西的好方法:模块的用户可以在模块使用的同一包中创建类,从而访问该模块的包本地部分。跨度>
    • 但是这样我必须将一个 80 行和一个 130 行长的类放在同一个文件中,并且代码变得足够长,难以阅读和导航。我觉得不是很干净。它也使单元测试变得更加困难,因为我必须在单元测试中使用工厂来获取实例,所以它不再是一个“单元”测试了。
    • @yole 即使包可见性“不是隐藏任何东西的好方法”,它也不会使它成为一个好的模式,即如果你想创建一个具有公共访问权限的 StorageAPI,而你在同一个包/子包中定义不同的持久性/缓存方式(文件、数据库、内存等),您不希望从“存储”包中访问这些方式但要由 StorageAPI 处理,这是一种证明包可见性的示例,甚至没有考虑将数千行代码添加到包含更广泛概念的类中,以适应 Kotlin 的口味。
    • 有一个更广泛的关注/问题/问题,在这里称其为最合适的名称。 JVM是Java语言的解释器,Java语言是JVM的编程接口,在这方面Java相当于JVM。 “内部”如何映射到 Java/JVM?如何在 Kotlin 中创建等效的“包”访问。说 Kotlin 和 Java 可以互操作是有很大缺陷的,我想说,除非可以在两者之间进行 1 对 1 的映射。因此,如果一个 Java 中的 Factory 初始化程序可以处理各种情况下的许多类,那么所有这些类都将最终出现在 1 个荒谬的巨大文件中
    猜你喜欢
    • 2015-09-06
    • 2014-11-06
    • 1970-01-01
    • 2020-12-15
    • 2019-03-24
    • 2021-11-18
    • 2013-05-19
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多