"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static
在需要时替换Java .
我很困惑:
companion object
块内组合它?:
companion object {
val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种单一的方式.有什么更好的方法?
我试图理解使用/不使用@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)
所以我的问题是:
谢谢!
随播对象的文档具有以下示例
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 课程:
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),但没有效果。
如何访问这些伴随对象常量?
更新我认为我的问题与给定的重复项不同,因为我想创建常量,而不是静态方法。
我希望能够从它的伴随对象访问我的类的 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)
我尝试了两件事:
将 Outer 的 simpleName 分配给伴生对象的 COMPANION_TAG,然后使用来自伴生初始化和所有 Outer 函数的 COMPANION_TAG。我可以从我需要的任何地方访问 COMPANION_TAG,但不幸的是,我只能通过这种方式获得“Companion”而不是“Outer”。
从伴随对象的初始化访问 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) 我正在使用 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)
这里没有内存泄漏吗?感谢您的回答:)
众所周知,Kotlin 和 Java 是可以互操作的。当我尝试访问 Kotlin 代码中的 Java 静态变量时,它可以工作,但是当我尝试访问 Java 中的伴生对象时,它不起作用。