有没有一种在 Kotlin 中拥有私有文件常量的方法?

16
假设我有一个 Utils.kt 文件,其中只包含一些实用功能函数,没有类或对象。假设这些函数使用一些共同的常量值。
那么我会像这样做:
package myapp

private val CONST1 = 1
private val CONST2 = 2

public fun function1() {}
public fun function2() {}

不幸的是,Kotlin将 private 视为“整个包都可用”。 因此,CONST1和CONST2在同一包中的所有文件中都可用。 唯一的隔离方法是将此文件移动到单独的软件包中。

但是,如果我有几个类似于这样的实用程序文件,每个文件都有自己的一组私有 常量。那么我只有两个选择:将它们中的每一个移动到唯一的包中,或者放弃并让所有文件的常量都无处不在。

两种方法都会导致混乱。

还有其他选项或建议吗?

(更新:实际上,我必须说这是 Kotlin 中令我困扰的罕见事情之一 - 没有办法使某些实体成为文件本地的(而不使用一些语法技巧):它要么对整个包可用,要么对所有人都可用)

更新:此问题现已过时(请参见已接受的答案)


@JaysonMinard的回答已被接受,并已更新以反映当前情况。 - dimsuz
好的,那我删除了另一个答案,因为它不再需要。 - Jayson Minard
/* Kotlin编程 */ - voddan
1个回答

12

private 可见性的顶层声明只在声明它们的文件中可见。

(原回答,截至回答问题时有效:Kotlin 没有任何文件级作用域的概念,据我所知也没有引入它的计划。如果您不喜欢包级作用域(为什么?),您可以创建一个封装函数和它们使用的私有常量的 object


2
我不喜欢包范围,因为我倾向于有许多文件本地变量,它们会使所有完成弹出窗口混乱,并且通常我不需要它们在任何地方可见。我知道我可以使用一个“对象”,但那似乎更像是一种hack... - dimsuz
在 Kotlin 中,包结构不必对应目录结构,因此您可以为每个文件设置不同的包,而无需更改项目中文件的结构。 - yole
1
是的,我注意到了,只是感觉有些不寻常。这是推荐的方式吗?实际上,我对如何在考虑所有这些内容的情况下组织我的Kotlin项目感到有些迷茫:默认包作用域,每个文件的任意包名称。我真的很想从Kotlin作者那里得到一些最佳实践或建议。Java在这方面更加严格,我觉得这带来了一些秩序... - dimsuz
推荐的方式是遵循Java惯例,因为这是唯一允许您在同一源根中自由混合Java和Kotlin源文件的方法。然而,对于纯Kotlin项目,您有更多的灵活性,每个文件拥有一个独特的包是可能的方法之一。 - yole
好的,谢谢。尽管我遵循Java的规范,但仍然遇到了这种情况,这也引出了我提出这个问题的原因...好吧,我想我必须学会接受它 :) - dimsuz
3
这个答案已经过时了,private现在是顶层项的文件局部作用域。 - Jayson Minard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接