标签: kotlin-companion

为什么我们使用"伴侣对象"作为Kotlin中Java静态字段的替代?

"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static在需要时替换Java .

我很困惑:

  • 为什么称它为"伴侣"?
  • 这是否意味着要创建多个静态属性,我必须在companion object块内组合它?
  • 为了立即创建一个作用于类的单例实例,我经常写

:

companion object {
    val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一种单一的方式.有什么更好的方法?

kotlin kotlin-companion

141
推荐指数
4
解决办法
3万
查看次数

为什么以及何时将@JvmStatic与伴侣对象一起使用?

我试图理解使用/不使用@JvmStatic与何时使用其中任何一个之间的区别.

所以,使用Kotlin和Java,我可以这样做:

TestKotlin.kt

class TestKotlin {
    companion object {
        val someString = "hello world"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后由Java调用,如下所示:

TestJava.java

public class TestJava {
    String kotlinStaticString = TestKotlin.Companion.getSomeString();
}
Run Code Online (Sandbox Code Playgroud)

但是,有这个选项2:

TestKotlin.kt V2

class TestKotlin {
    companion object {
        @JvmStatic  // <-- notice the @JvmStatic annotation
        val someString = "hello world"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,从Java调用它,如下所示:

TestJava.java V2

public class TestJava {
    String kotlinStaticString = TestKotlin.getSomeString();
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 在行为或内存分配方面,这两种情况有何不同?
  • 是否有偏好使用哪一个?
  • 两者都创建一个伪静态单例对象,就像Java静态一样吗?

谢谢!

java android kotlin kotlin-companion

36
推荐指数
3
解决办法
1万
查看次数

在kotlin中命名伴侣对象有什么意义

随播对象的文档具有以下示例

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}
Run Code Online (Sandbox Code Playgroud)

Factory是伴随对象的名称.然后继续说:

可以省略伴随对象的名称,在这种情况下Companion将使用名称:

但是,我没有看到使用伴随对象名称的示例.

因为每个类只能有一个伴侣对象(否则你会收到Only one companion object is allowed per class错误),这个名字对我来说就像是一些非常无用的语法糖.

同伴对象的名称实际上可以用于什么?为什么有人会为此使用任何名称呢?

kotlin kotlin-companion

17
推荐指数
2
解决办法
1474
查看次数

如何从 Java 访问 Kotlin 伴生对象

我有这个 Kotlin 课程:

class Storage {
    companion object {
        val COL_ID = "id"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想COL_ID在我的 Java 代码中使用:

doSomething(Storage.COL_ID);
Run Code Online (Sandbox Code Playgroud)

但是,编译器告诉我这COL_ID是私有的。我试图添加public到所有元素(类、对象和 val),但没有效果。

如何访问这些伴随对象常量?

更新我认为我的问题与给定的重复项不同,因为我想创建常量,而不是静态方法。

java kotlin kotlin-companion

5
推荐指数
1
解决办法
792
查看次数

如何从 kotlin 中的伴生对象访问外部类的 javaClass.simpleName?

我希望能够从它的伴随对象访问我的类的 simpleName。

我想要这个:

val o1 = Outer("foo")
val o2 = Outer("bar")
Run Code Online (Sandbox Code Playgroud)

打印以下输出:

Outer: hello
Outer: foo
Outer: bar
Run Code Online (Sandbox Code Playgroud)

实际用例在java中是这样的:

class Outer {
    static final String TAG = Outer.class.simpleName();
    // and now I'm able to use Outer.TAG or just TAG in both static and non-static methods
}
Run Code Online (Sandbox Code Playgroud)

我尝试了两件事:

  1. 将 Outer 的 simpleName 分配给伴生对象的 COMPANION_TAG,然后使用来自伴生初始化和所有 Outer 函数的 COMPANION_TAG。我可以从我需要的任何地方访问 COMPANION_TAG,但不幸的是,我只能通过这种方式获得“Companion”而不是“Outer”。

  2. 从伴随对象的初始化访问 Outer.OUTER_TAG。这里的问题是我找不到访问它的方法。

这是代码:

class Outer(str: String) {
    private val OUTER_TAG = javaClass.simpleName
    companion object {
        @JvmStatic val COMPANION_TAG = PullDownAnimationLayout.javaClass.simpleName // gives "Companion" …
Run Code Online (Sandbox Code Playgroud)

static kotlin companion-object kotlin-companion

4
推荐指数
1
解决办法
3214
查看次数

Kotlin 伴生对象中的内存泄漏?

我正在使用 Kotlin 进行 Android 开发。有趣的问题。在 Java 中,将 Context 保存在静态字段中会导致内存泄漏。但如果我将上下文存储在 Kotlin 伴生对象中,Android Studio 不会说这是内存泄漏。这意味着在Java字节码中同伴对象不是静态代码?例如:

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        appContext = applicationContext
    }

    companion object {
        lateinit var appContext: Context
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有内存泄漏吗?感谢您的回答:)

memory-leaks kotlin kotlin-companion

2
推荐指数
1
解决办法
4764
查看次数

为什么 Java 代码无法访问 Companion 对象?

众所周知,Kotlin 和 Java 是可以互操作的。当我尝试访问 Kotlin 代码中的 Java 静态变量时,它可以工作,但是当我尝试访问 Java 中的伴生对象时,它不起作用。

java kotlin companion-object kotlin-companion

0
推荐指数
1
解决办法
1603
查看次数