【问题标题】:When should I prefer top-level const vs companion object const?我什么时候应该更喜欢顶级 const 与伴随对象 const?
【发布时间】:2020-07-19 20:35:21
【问题描述】:

我想知道何时应该使用顶级 const 以及何时使用伴生对象?如果财产是私有的还是公共的,我应该考虑使用什么?

const val URI = "sdfsdfsdf"

或者我应该使用:

companion object {
    const val URI = "sdfsdfsdf"
}

当我们处理可见性时,使用什么重要吗?

【问题讨论】:

  • 我更喜欢在顶层使用常量,但我不知道是否所有插件,但一些插件计算测试覆盖率使用 .class 文件,但是当你使用 const 声明时在一个类的顶层,它在内部创建了一个 kt 类,因此覆盖率降低了,因为对于插件来说,该类有两个部分 = .class 和另一个 .kt,而 kt 的覆盖率是 0% xD跨度>
  • 一个伴生对象是一个单例,换句话说,全局可访问并且到处都是单个实例,所以我不知道它们之间是否有任何区别,因为它们具有几乎相同的属性。但为了简单起见,我更喜欢顶级
  • 性能方面怎么样?

标签: android kotlin


【解决方案1】:

According to JetBrains:

建议的做法是从不使用对象来创建命名空间,并尽可能始终使用顶级声明。我们没有发现名称冲突是个问题,如果您确实遇到了冲突,您可以使用带别名的导入来解决它。

所以基于你最初问题的答案

什么时候我应该更喜欢顶级 const [...]?

总是

不过,这是一个建议,最终由您决定如何组织代码并使用 IDE 中的代码完成功能。有时最好不要为了自动完成而污染全局命名空间。由于这个问题/问题已通过许多线程(例如herehere)进行了广泛讨论,我想说这在很大程度上取决于一个人的喜好,我将把它留在这里。

但是,如果您想知道幕后发生的事情,那么从字节码的角度来看,两种方法之间存在细微差别。顶级或(伴随)对象常量最终都作为某个类的静态成员,但对象方法另外创建了一个静态 INSTANCE 字段来保存对象的引用。在记忆方面,这应该不会有太大的不同,但最好能意识到这一点。

【讨论】:

  • JetBrains 说您永远不会有名称冲突。但例如,当我想在同一个包中的 2 个不同类之上创建顶级常量时,我​​无法做到,编译器会抱怨消息“名称冲突”
  • @ArturA 包结构不一定要与 Kotlin 中的目录结构相同。因此,您始终可以创建单独的命名空间,即使在同一个目录中也是如此。我想这就是他们说永远不会发生冲突的原因。
  • @ArturA 您的意思是包名称与目录结构不匹配的示例?我只是编辑我的答案并将两个具有不同包名称的类放在那里,这真的不会显示任何东西。我建议您在 IntelliJ 或 AS 中为自己设置一个简单的项目,在同一目录中创建两个文件,将其更改为 package 名称,使其不再匹配,然后使用声明和导入。您可能会注意到您会收到一条警告说 Package 指令与文件位置不匹配,考虑到这是避免冲突的推荐方法,这很有趣。
  • @ArturA 澄清一下,正如我已经说过的,将“所有内容”声明为顶级只是一个建议,因此最好将其纳入考虑,但最终可读性、一致性和易用性是最重要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2022-01-08
  • 2011-05-10
  • 2016-05-20
  • 2017-12-21
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多