Kotlin中的包等效可见性修饰符

Lor*_*one 6 java kotlin

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

AssetFundValidator类验证一些投入,并能实例化一个有效AssetFundCalculatorImpl.

我想如果程序的其余部分只知道接口,而不是AssetFundCalculatorImpl,那么只有AssetFundValidator可以实例化它.

我的包结构如下所示:

在此输入图像描述

在Java中,我会将包可见性修饰符赋予AssetFundCalculatorImpl类或它的构造函数,它可以解决问题,但在Kotlin中,没有包可见性修饰符.

这个问题有方法解决吗?我不想将此代码放到单独编译的模块中,因此内部修饰符不起作用.

yol*_*ole 4

您可以将AssetFundValidatorAssetFundCalculatorImpl放入同一个文件中并标记AssetFundCalculatorImplprivate. 在这种情况下,只能访问同一文件中的代码(包括 )AssertFundValidator,但不能访问程序其他部分中的任何代码。

  • 但这样我就必须将 80 行和 130 行长的类放在同一个文件中,并且代码变得足够长,使其难以阅读和导航。我认为它不是很干净。它还使单元测试变得更加困难,因为我必须在单元测试中使用工厂来获取实例,因此它不再是“单元”测试。 (8认同)
  • @yole即使包可见性“不是隐藏任何东西的好方法”,它也不会使其作为一个好的模式失效,即如果你想创建一个具有公共访问权限的StorageAPI并且你在同一个包/子中定义打包不同的持久性/缓存方式(文件、数据库、内存等),您不希望从“存储”包中访问这些方式,而是由 StorageAPI 处理,这是一个证明包可见性的示例,甚至不是考虑向一个类添加数千行代码,该类包含更广泛的概念,以满足 Kotlin 的口味。 (6认同)
  • 毕竟我没有使用这个解决方案,我真的不喜欢将两个类放在一个文件中。从语言中省略包修饰符的原因是什么? (2认同)