【问题标题】:creating "public" constants in a kotlin class [duplicate]在 kotlin 类中创建“公共”常量
【发布时间】:2020-04-16 01:39:55
【问题描述】:

也许这是不好的做法,但在 Java 中我经常会创建类似的东西:

public class MyService extends Service {

  public static final String ACTION_CONNECTED = "blablabla";

...
}

并在另一个类中引用它,例如:

MyService.ACTION_CONNECTED

这太棒了。我可以让我的常量很好地与他们的类相关联。

我似乎在 Kotlin 中找不到等价物。我看到到处都是建议人们创建常量文件(对象)的解决方案,但我认为这不是很优雅。我希望有某种方法可以在其文件之外公开顶级 const val BLAB,这样我就可以保持我的 ClassName.CONSTANT 语法继续运行,但它看起来不像是在卡片中。

在类之间共享常量方面,是否存在(以及它是什么)与旧的 public static final 相当的 Kotlin?

【问题讨论】:

  • 我想我正在寻找的是在 Java 中如何将常量限定为类(不是全局)但公共的。我认为这使代码更具可读性,并且能够在没有歧义的情况下重用常量名称是件好事。也就是说,它实际上看起来像伴生对象做我想要的!似乎没有人使该示例用例显而易见(至少对我而言)。

标签: java android kotlin constants


【解决方案1】:
class MyService  {
    companion object {
        @JvmStatic const val ACTION_CONNECTED = "blablabla"
    }
}

MyService.ACTION_CONNECTED 

这相当于 kotlin 的 public static final

【讨论】:

  • 如果您的静态变量或方法仅从 Java 中引用,您还可以为类似 Java 的 MyService.ACTION_CONNECTED 静态语法添加 @JvmStatic 注释
  • 我不会说“来自 only Java”;如果它们也被 Java 和 Kotlin 引用,这将很有用。
  • 我一直在使用伴随对象,但在文档中这个范围对我来说并不明显。出于某种原因,我认为您只能访问关联类中伴随对象中的内容。额外的MyService.ACTION_CONNECTED 有所作为。谢谢!
【解决方案2】:

根据 Jetbrains 在此视频中的说法: https://www.coursera.org/learn/kotlin-for-java-developers/lecture/85GKr/objects-object-expressions-companion-objects

有 3 种方法可以为类创建静态方法或函数:

  1. 在顶层声明静态成员(默认方法)
  2. 在对象中声明它们(单例)
  3. 在伴生对象中声明它们

如果您想尽可能地模仿 Java 的体验,使用方法 1 应该是最简单的方法。您将能够使用引擎盖下的 getter 或直接访问来访问成员。这是一个例子:

MyService.kt 将是您的 Kotlin 文件的名称。

val ACTION_CONNECTED = "blablabla"

class MyService :Service{
//your other class details
}

你可以像这样从另一个 Kotlin 文件或 Activity 中访问它:

val myAction=ACTION_CONNECTED

如果你把它标记为 const 也会更好,因为它是一个像这样的常量值:

 const val ACTION_CONNECTED = "blablabla"

【讨论】:

    【解决方案3】:

    如果要在 kotlin 中创建 final 变量,请使用 val 而不是使用 var

    val LastCount = 1
    

    对于创建静态变量,请使用 companion object

    companion object{
        val lastCount = 1
       }
    

    现在您想在其他类中访问此变量。 所以像这样创建一个新类:

    class Counter{
       companion object{
        val lastCount = 1
       }
    }
    

    然后像这样在整个项目中使用它

    Counter.lastCount 
    

    【讨论】:

    • 最好为您在此处所做的事情添加更多描述或 cmets
    • 这是我在 StackOverflow 中的第一个答案:D
    • 是的,这就是我发表评论的原因。而不是一面旗帜。 :D 试着添加更多的 cmets 和描述,这样你的答案就不会得到反对票。
    • 我会记得的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2021-09-14
    • 2017-04-10
    • 2016-10-25
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多