在Kotlin类中创建“公共”常量。

4

也许这是不好的实践方式,但在Java中我经常会创建类似于以下内容的代码:

public class MyService extends Service {

  public static final String ACTION_CONNECTED = "blablabla";

...
}

然后在另一个类中引用它:

MyService.ACTION_CONNECTED

这太棒了。我可以将常量与其类良好关联。

我似乎找不到Kotlin中的等效项。我看到有人提出创建常量文件(对象)的解决方案,但我觉得那不是很优雅。我希望有一种方法可以在文件外部公开顶层const val BLAB,以便我可以保持ClassName.CONSTANT语法,但看起来似乎做不到。

是否有(以及是什么)Kotlin相当于共享常量的public static final


1
这个回答解决了你的问题吗?Kotlin中Java静态final字段的等效物是什么? - jsamol
我想我在寻找的是Java中如何将常量作用域限定为类(而不是全局)但是公共的。我认为这使得代码更易读,并且能够重复使用常量名称而没有歧义是很好的。话虽如此,实际上似乎同伴对象做到了我想要的! 没有人似乎让这个示例用例显而易见(至少对我来说)。 - kkemper
3个回答

3
class MyService  {
    companion object {
        @JvmStatic const val ACTION_CONNECTED = "blablabla"
    }
}

MyService.ACTION_CONNECTED 

这将相当于Kotlin中的public static final。

1
如果您的静态变量或方法仅从Java中引用,您还可以为类似于Java的MyService.ACTION_CONNECTED静态语法添加@JvmStatic注释。 - Haroon
我不会说“仅限于Java”; 如果它们也被Java和Kotlin引用,那么这很有用。 - Alexey Romanov
我一直在使用伴生对象,但它的作用域在文档中从未明确说明。由于某种原因,我一直认为只能在相关类中访问伴生对象中的内容。那个额外的MyService.ACTION_CONNECTED起到了关键作用。谢谢! - kkemper

2
如果你想在Kotlin中创建一个不可变变量,使用val而不是var
val LastCount = 1

创建静态变量时,请使用companion object关键字

companion object{
    val lastCount = 1
   }

现在您想在其他类中访问此变量。 因此,请创建一个新类,如下所示:

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

然后就可以像这样在整个项目中使用它。
Counter.lastCount 

最好为你在这里完成的工作添加更多描述或注释。 - Rahal Kanishka
这是我在StackOverflow上的第一个回答 :D - milad mosavie
是的,这就是为什么我放了一个注释而不是一个标志。 :D 尝试添加更多的注释和描述,这样你的答案就不会被负面评价了。 - Rahal Kanishka
我会记住的。谢谢。 - milad mosavie

1
根据Jetbrains在此视频中的说法: https://www.coursera.org/learn/kotlin-for-java-developers/lecture/85GKr/objects-object-expressions-companion-objects 有三种方法可以为类创建静态方法或函数:
  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"

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